@fragno-dev/pi-fragment 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +107 -0
  3. package/bin/run.js +72 -0
  4. package/dist/browser/client/react.d.ts +264 -0
  5. package/dist/browser/client/react.d.ts.map +1 -0
  6. package/dist/browser/client/react.js +84 -0
  7. package/dist/browser/client/react.js.map +1 -0
  8. package/dist/browser/client/solid.d.ts +266 -0
  9. package/dist/browser/client/solid.d.ts.map +1 -0
  10. package/dist/browser/client/solid.js +122 -0
  11. package/dist/browser/client/solid.js.map +1 -0
  12. package/dist/browser/client/svelte.d.ts +261 -0
  13. package/dist/browser/client/svelte.d.ts.map +1 -0
  14. package/dist/browser/client/svelte.js +126 -0
  15. package/dist/browser/client/svelte.js.map +1 -0
  16. package/dist/browser/client/vanilla.d.ts +238 -0
  17. package/dist/browser/client/vanilla.d.ts.map +1 -0
  18. package/dist/browser/client/vanilla.js +11 -0
  19. package/dist/browser/client/vanilla.js.map +1 -0
  20. package/dist/browser/client/vue.d.ts +264 -0
  21. package/dist/browser/client/vue.d.ts.map +1 -0
  22. package/dist/browser/client/vue.js +125 -0
  23. package/dist/browser/client/vue.js.map +1 -0
  24. package/dist/browser/client-Bk-J98pf.d.ts +679 -0
  25. package/dist/browser/client-Bk-J98pf.d.ts.map +1 -0
  26. package/dist/browser/factory-DKoO_lRA.js +2470 -0
  27. package/dist/browser/factory-DKoO_lRA.js.map +1 -0
  28. package/dist/browser/index.d.ts +776 -0
  29. package/dist/browser/index.d.ts.map +1 -0
  30. package/dist/browser/index.js +3 -0
  31. package/dist/cli/cli.d.ts +1 -0
  32. package/dist/cli/cli.js +10 -0
  33. package/dist/cli/cli.js.map +1 -0
  34. package/dist/cli/config.d.ts +13 -0
  35. package/dist/cli/config.d.ts.map +1 -0
  36. package/dist/cli/config.js +64 -0
  37. package/dist/cli/config.js.map +1 -0
  38. package/dist/cli/http/client.js +95 -0
  39. package/dist/cli/http/client.js.map +1 -0
  40. package/dist/cli/mod.d.ts +62 -0
  41. package/dist/cli/mod.d.ts.map +1 -0
  42. package/dist/cli/mod.js +644 -0
  43. package/dist/cli/mod.js.map +1 -0
  44. package/dist/cli/render/index.d.ts +23 -0
  45. package/dist/cli/render/index.d.ts.map +1 -0
  46. package/dist/cli/render/index.js +37 -0
  47. package/dist/cli/render/index.js.map +1 -0
  48. package/dist/node/index.d.ts +10 -0
  49. package/dist/node/index.js +9 -0
  50. package/dist/node/pi/clients.d.ts +240 -0
  51. package/dist/node/pi/clients.d.ts.map +1 -0
  52. package/dist/node/pi/clients.js +18 -0
  53. package/dist/node/pi/clients.js.map +1 -0
  54. package/dist/node/pi/constants.d.ts +9 -0
  55. package/dist/node/pi/constants.d.ts.map +1 -0
  56. package/dist/node/pi/constants.js +22 -0
  57. package/dist/node/pi/constants.js.map +1 -0
  58. package/dist/node/pi/definition.d.ts +13 -0
  59. package/dist/node/pi/definition.d.ts.map +1 -0
  60. package/dist/node/pi/definition.js +10 -0
  61. package/dist/node/pi/definition.js.map +1 -0
  62. package/dist/node/pi/dsl.d.ts +24 -0
  63. package/dist/node/pi/dsl.d.ts.map +1 -0
  64. package/dist/node/pi/dsl.js +57 -0
  65. package/dist/node/pi/dsl.js.map +1 -0
  66. package/dist/node/pi/factory.d.ts +220 -0
  67. package/dist/node/pi/factory.d.ts.map +1 -0
  68. package/dist/node/pi/factory.js +12 -0
  69. package/dist/node/pi/factory.js.map +1 -0
  70. package/dist/node/pi/mappers.js +47 -0
  71. package/dist/node/pi/mappers.js.map +1 -0
  72. package/dist/node/pi/route-schemas.js +112 -0
  73. package/dist/node/pi/route-schemas.js.map +1 -0
  74. package/dist/node/pi/types.d.ts +67 -0
  75. package/dist/node/pi/types.d.ts.map +1 -0
  76. package/dist/node/pi/workflow.d.ts +31 -0
  77. package/dist/node/pi/workflow.d.ts.map +1 -0
  78. package/dist/node/pi/workflow.js +242 -0
  79. package/dist/node/pi/workflow.js.map +1 -0
  80. package/dist/node/routes.d.ts +217 -0
  81. package/dist/node/routes.d.ts.map +1 -0
  82. package/dist/node/routes.js +328 -0
  83. package/dist/node/routes.js.map +1 -0
  84. package/dist/node/schema.js +12 -0
  85. package/dist/node/schema.js.map +1 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -0
  87. package/package.json +125 -0
@@ -0,0 +1,328 @@
1
+ import { piSchema } from "./schema.js";
2
+ import { piFragmentDefinition } from "./pi/definition.js";
3
+ import { messageAckSchema, sessionBaseSchema, sessionDetailSchema } from "./pi/route-schemas.js";
4
+ import { extractAssistantTextFromMessage, normalizeSteeringMode, toSessionOutput } from "./pi/mappers.js";
5
+ import { PI_WORKFLOW_NAME } from "./pi/workflow.js";
6
+ import { defineRoutes } from "@fragno-dev/core";
7
+ import { createId } from "@fragno-dev/db/id";
8
+ import { z } from "zod";
9
+
10
+ //#region src/routes.ts
11
+ const DEFAULT_PAGE_SIZE = 50;
12
+ const MAX_PAGE_SIZE = 200;
13
+ const MAX_HISTORY_RUNS = 5;
14
+ const createRouteError = (code, message, status) => {
15
+ const error = new Error(message);
16
+ error.code = code;
17
+ error.status = status;
18
+ return error;
19
+ };
20
+ const isSessionRouteErrorCode = (value) => value === "SESSION_NOT_FOUND" || value === "WORKFLOWS_REQUIRED" || value === "WORKFLOW_INSTANCE_MISSING";
21
+ const isRecord = (value) => typeof value === "object" && value !== null;
22
+ const getArrayFromResult = (result, key) => {
23
+ if (!isRecord(result)) return null;
24
+ const value = result[key];
25
+ return Array.isArray(value) ? value : null;
26
+ };
27
+ const getAssistantFromResult = (result) => {
28
+ if (!isRecord(result)) return null;
29
+ const assistant = result["assistant"];
30
+ if (!assistant || typeof assistant !== "object") return null;
31
+ return assistant;
32
+ };
33
+ const parseAssistantTurn = (name) => {
34
+ const match = /^assistant-(\d+)$/.exec(name);
35
+ return match ? Number.parseInt(match[1], 10) : null;
36
+ };
37
+ const deriveHistory = (steps, output) => {
38
+ let messages = [];
39
+ const trace = [];
40
+ const summaries = [];
41
+ let lastAssistant = null;
42
+ const sortedSteps = [...steps].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
43
+ for (const step of sortedSteps) {
44
+ if (!step.result) continue;
45
+ const stepMessages = getArrayFromResult(step.result, "messages");
46
+ if (stepMessages) messages = stepMessages;
47
+ const stepTrace = getArrayFromResult(step.result, "trace");
48
+ if (stepTrace) trace.push(...stepTrace);
49
+ const assistant = getAssistantFromResult(step.result);
50
+ const turn = parseAssistantTurn(step.name);
51
+ if (assistant && turn !== null) {
52
+ lastAssistant = assistant;
53
+ summaries.push({
54
+ turn,
55
+ assistant,
56
+ summary: extractAssistantTextFromMessage(assistant) || null
57
+ });
58
+ }
59
+ }
60
+ if (messages.length === 0 && isRecord(output) && Array.isArray(output["messages"])) messages = output["messages"];
61
+ if (lastAssistant && !messages.some((message) => message?.role === "assistant")) messages = [...messages, lastAssistant];
62
+ return {
63
+ messages,
64
+ trace,
65
+ summaries
66
+ };
67
+ };
68
+ const collectHistorySteps = (pages, maxRunNumber) => {
69
+ return pages.filter((page) => page.runNumber <= maxRunNumber).flatMap((page) => page.steps);
70
+ };
71
+ const piRoutesFactory = defineRoutes(piFragmentDefinition).create(({ config, defineRoute, serviceDeps }) => {
72
+ return [
73
+ defineRoute({
74
+ method: "POST",
75
+ path: "/sessions",
76
+ inputSchema: z.object({
77
+ agent: z.string(),
78
+ name: z.string().optional(),
79
+ metadata: z.any().optional(),
80
+ tags: z.array(z.string()).optional(),
81
+ steeringMode: z.enum(["all", "one-at-a-time"]).optional()
82
+ }),
83
+ outputSchema: sessionBaseSchema,
84
+ errorCodes: [
85
+ "AGENT_NOT_FOUND",
86
+ "WORKFLOWS_REQUIRED",
87
+ "WORKFLOW_CREATE_FAILED"
88
+ ],
89
+ handler: async function({ input }, { json, error }) {
90
+ const values = await input.valid();
91
+ const workflowsService = serviceDeps.workflows;
92
+ if (!workflowsService) return error({
93
+ message: "Workflows service is required.",
94
+ code: "WORKFLOWS_REQUIRED"
95
+ }, { status: 500 });
96
+ const agentName = values.agent;
97
+ const agent = config.agents?.[agentName];
98
+ if (!agent) return error({
99
+ message: `Agent ${agentName} not found.`,
100
+ code: "AGENT_NOT_FOUND"
101
+ }, { status: 404 });
102
+ const now = /* @__PURE__ */ new Date();
103
+ const steeringMode = normalizeSteeringMode(values.steeringMode ?? config.defaultSteeringMode);
104
+ const sessionId = createId();
105
+ try {
106
+ const created = await this.handlerTx().withServiceCalls(() => [workflowsService.createInstance(PI_WORKFLOW_NAME, {
107
+ id: sessionId,
108
+ params: {
109
+ sessionId,
110
+ agentName,
111
+ systemPrompt: agent.systemPrompt,
112
+ initialMessages: []
113
+ }
114
+ })]).mutate(({ forSchema }) => {
115
+ forSchema(piSchema).create("session", {
116
+ id: sessionId,
117
+ name: values.name ?? null,
118
+ agent: agentName,
119
+ status: "active",
120
+ workflowInstanceId: sessionId,
121
+ steeringMode,
122
+ metadata: values.metadata ?? null,
123
+ tags: values.tags ?? null,
124
+ createdAt: now,
125
+ updatedAt: now
126
+ });
127
+ }).transform(({ serviceResult }) => serviceResult[0]).execute();
128
+ const workflowInstanceId = created.id;
129
+ const workflowStatus = created.details;
130
+ return json({
131
+ id: sessionId,
132
+ name: values.name ?? null,
133
+ status: workflowStatus.status,
134
+ agent: agentName,
135
+ workflowInstanceId,
136
+ steeringMode,
137
+ metadata: values.metadata ?? null,
138
+ tags: values.tags ?? [],
139
+ createdAt: now,
140
+ updatedAt: now
141
+ });
142
+ } catch (err) {
143
+ return error({
144
+ message: err instanceof Error ? err.message : "Failed to create workflow instance.",
145
+ code: "WORKFLOW_CREATE_FAILED"
146
+ }, { status: 500 });
147
+ }
148
+ }
149
+ }),
150
+ defineRoute({
151
+ method: "GET",
152
+ path: "/sessions",
153
+ queryParameters: ["limit"],
154
+ outputSchema: z.array(sessionBaseSchema),
155
+ handler: async function({ query }, { json }) {
156
+ const limit = Number.parseInt(query.get("limit") ?? `${DEFAULT_PAGE_SIZE}`, 10);
157
+ const normalizedLimit = Number.isFinite(limit) ? Math.max(1, Math.min(MAX_PAGE_SIZE, limit)) : DEFAULT_PAGE_SIZE;
158
+ const [sessions] = await this.handlerTx().retrieve(({ forSchema }) => {
159
+ return forSchema(piSchema).find("session", (b) => b.whereIndex("idx_session_created").orderByIndex("idx_session_created", "desc").pageSize(normalizedLimit));
160
+ }).execute();
161
+ return json(sessions.map(toSessionOutput));
162
+ }
163
+ }),
164
+ defineRoute({
165
+ method: "GET",
166
+ path: "/sessions/:sessionId",
167
+ outputSchema: sessionDetailSchema,
168
+ errorCodes: [
169
+ "SESSION_NOT_FOUND",
170
+ "WORKFLOWS_REQUIRED",
171
+ "WORKFLOW_INSTANCE_MISSING"
172
+ ],
173
+ handler: async function({ pathParams }, { json, error }) {
174
+ const sessionId = pathParams.sessionId;
175
+ const workflowsService = serviceDeps.workflows;
176
+ if (!workflowsService) return error({
177
+ message: "Workflows service is required.",
178
+ code: "WORKFLOWS_REQUIRED"
179
+ }, { status: 500 });
180
+ const workflowName = PI_WORKFLOW_NAME;
181
+ try {
182
+ const [sessionRow] = await this.handlerTx().retrieve(({ forSchema }) => {
183
+ return forSchema(piSchema).findFirst("session", (b) => b.whereIndex("primary", (eb) => eb("id", "=", sessionId)));
184
+ }).execute();
185
+ if (!sessionRow) throw createRouteError("SESSION_NOT_FOUND", `Session ${sessionId} not found.`, 404);
186
+ const workflowInstanceId = sessionRow.workflowInstanceId;
187
+ if (!workflowInstanceId) throw createRouteError("SESSION_NOT_FOUND", `Session ${sessionId} not found.`, 404);
188
+ const result = await this.handlerTx().withServiceCalls(() => {
189
+ const historyCalls = Array.from({ length: MAX_HISTORY_RUNS + 1 }, (_, runNumber) => workflowsService.listHistory({
190
+ workflowName,
191
+ instanceId: workflowInstanceId,
192
+ runNumber
193
+ }));
194
+ return [
195
+ workflowsService.getInstanceStatus(workflowName, workflowInstanceId),
196
+ workflowsService.getInstanceRunNumber(workflowName, workflowInstanceId),
197
+ ...historyCalls
198
+ ];
199
+ }).mutate(({ forSchema, serviceIntermediateResult }) => {
200
+ const [workflowStatus] = serviceIntermediateResult;
201
+ forSchema(piSchema).update("session", sessionRow.id, (b) => b.set({
202
+ status: workflowStatus.status,
203
+ updatedAt: /* @__PURE__ */ new Date()
204
+ }).check());
205
+ }).transform(({ serviceResult }) => {
206
+ const [workflowStatus, runNumber, ...historyPages] = serviceResult;
207
+ const maxRunNumber = Number.isFinite(runNumber) ? Math.max(0, Math.min(MAX_HISTORY_RUNS, runNumber)) : 0;
208
+ return {
209
+ workflowStatus,
210
+ history: deriveHistory(collectHistorySteps(historyPages.slice(0, maxRunNumber + 1), maxRunNumber), workflowStatus.output)
211
+ };
212
+ }).execute();
213
+ return json({
214
+ ...toSessionOutput(sessionRow),
215
+ status: result.workflowStatus.status,
216
+ workflow: {
217
+ status: result.workflowStatus.status,
218
+ error: result.workflowStatus.error,
219
+ output: result.workflowStatus.output
220
+ },
221
+ messages: result.history.messages,
222
+ trace: result.history.trace,
223
+ summaries: result.history.summaries
224
+ });
225
+ } catch (err) {
226
+ if (err && typeof err === "object" && "code" in err && "status" in err) {
227
+ const routeError = err;
228
+ const code = isSessionRouteErrorCode(routeError.code) ? routeError.code : "WORKFLOW_INSTANCE_MISSING";
229
+ const status = code === "SESSION_NOT_FOUND" ? 404 : 500;
230
+ return error({
231
+ message: routeError.message,
232
+ code
233
+ }, { status });
234
+ }
235
+ if (err instanceof Error && err.message === "INSTANCE_NOT_FOUND") return error({
236
+ message: `Session ${sessionId} not found.`,
237
+ code: "SESSION_NOT_FOUND"
238
+ }, { status: 404 });
239
+ return error({
240
+ message: err instanceof Error ? err.message : "Failed to load workflow history.",
241
+ code: "WORKFLOW_INSTANCE_MISSING"
242
+ }, { status: 500 });
243
+ }
244
+ }
245
+ }),
246
+ defineRoute({
247
+ method: "POST",
248
+ path: "/sessions/:sessionId/messages",
249
+ inputSchema: z.object({
250
+ text: z.string(),
251
+ done: z.boolean().optional(),
252
+ steeringMode: z.enum(["all", "one-at-a-time"]).optional()
253
+ }),
254
+ outputSchema: messageAckSchema,
255
+ errorCodes: [
256
+ "SESSION_NOT_FOUND",
257
+ "WORKFLOWS_REQUIRED",
258
+ "WORKFLOW_INSTANCE_MISSING"
259
+ ],
260
+ handler: async function({ input, pathParams }, { json, error }) {
261
+ const values = await input.valid();
262
+ const sessionId = pathParams.sessionId;
263
+ const workflowsService = serviceDeps.workflows;
264
+ if (!workflowsService) return error({
265
+ message: "Workflows service is required.",
266
+ code: "WORKFLOWS_REQUIRED"
267
+ }, { status: 500 });
268
+ const workflowName = PI_WORKFLOW_NAME;
269
+ const payload = {
270
+ text: values.text,
271
+ done: values.done
272
+ };
273
+ if (values.steeringMode) payload.steeringMode = values.steeringMode;
274
+ try {
275
+ const [sessionRow] = await this.handlerTx().retrieve(({ forSchema }) => {
276
+ return forSchema(piSchema).findFirst("session", (b) => b.whereIndex("primary", (eb) => eb("id", "=", sessionId)));
277
+ }).execute();
278
+ if (!sessionRow) throw createRouteError("SESSION_NOT_FOUND", `Session ${sessionId} not found.`, 404);
279
+ const workflowInstanceId = sessionRow.workflowInstanceId;
280
+ if (!workflowInstanceId) throw createRouteError("SESSION_NOT_FOUND", `Session ${sessionId} not found.`, 404);
281
+ if (!payload.steeringMode) payload.steeringMode = normalizeSteeringMode(sessionRow.steeringMode ?? config.defaultSteeringMode);
282
+ return json({ status: (await this.handlerTx().withServiceCalls(() => [
283
+ workflowsService.sendEvent(workflowName, workflowInstanceId, {
284
+ type: "user_message",
285
+ payload
286
+ }),
287
+ workflowsService.getInstanceStatus(workflowName, workflowInstanceId),
288
+ workflowsService.getInstanceRunNumber(workflowName, workflowInstanceId)
289
+ ]).mutate(({ forSchema, serviceIntermediateResult }) => {
290
+ const [, workflowStatus] = serviceIntermediateResult;
291
+ const updates = { updatedAt: /* @__PURE__ */ new Date() };
292
+ if (values.steeringMode) updates.steeringMode = values.steeringMode;
293
+ updates.status = workflowStatus.status;
294
+ forSchema(piSchema).update("session", sessionRow.id, (b) => b.set(updates).check());
295
+ }).transform(({ serviceResult }) => {
296
+ const [, workflowStatus, runNumber] = serviceResult;
297
+ return {
298
+ workflowStatus,
299
+ runNumber
300
+ };
301
+ }).execute()).workflowStatus.status }, 202);
302
+ } catch (err) {
303
+ if (err && typeof err === "object" && "code" in err && "status" in err) {
304
+ const routeError = err;
305
+ const code = isSessionRouteErrorCode(routeError.code) ? routeError.code : "WORKFLOW_INSTANCE_MISSING";
306
+ const status = code === "SESSION_NOT_FOUND" ? 404 : 500;
307
+ return error({
308
+ message: routeError.message,
309
+ code
310
+ }, { status });
311
+ }
312
+ if (err instanceof Error && err.message === "INSTANCE_NOT_FOUND") return error({
313
+ message: `Session ${sessionId} not found.`,
314
+ code: "SESSION_NOT_FOUND"
315
+ }, { status: 404 });
316
+ return error({
317
+ message: err instanceof Error ? err.message : "Failed to deliver message.",
318
+ code: "WORKFLOW_INSTANCE_MISSING"
319
+ }, { status: 500 });
320
+ }
321
+ }
322
+ })
323
+ ];
324
+ });
325
+
326
+ //#endregion
327
+ export { piRoutesFactory };
328
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","names":[],"sources":["../../src/routes.ts"],"sourcesContent":["import { defineRoutes } from \"@fragno-dev/core\";\nimport { createId } from \"@fragno-dev/db/id\";\nimport type { AgentEvent, AgentMessage } from \"@mariozechner/pi-agent-core\";\nimport { z } from \"zod\";\n\nimport { piSchema } from \"./schema\";\nimport { piFragmentDefinition } from \"./pi/definition\";\nimport { messageAckSchema, sessionBaseSchema, sessionDetailSchema } from \"./pi/route-schemas\";\nimport {\n extractAssistantTextFromMessage,\n normalizeSteeringMode,\n toSessionOutput,\n} from \"./pi/mappers\";\nimport { PI_WORKFLOW_NAME } from \"./pi/workflow\";\nimport type {\n PiSession,\n PiTurnSummary,\n PiWorkflowHistoryStep,\n PiWorkflowsHistoryPage,\n PiWorkflowsInstanceStatus,\n} from \"./pi/types\";\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst MAX_PAGE_SIZE = 200;\nconst MAX_HISTORY_RUNS = 5;\n\ntype RouteError = Error & { code: string; status: number };\n\nconst createRouteError = (code: string, message: string, status: number): RouteError => {\n const error = new Error(message) as RouteError;\n error.code = code;\n error.status = status;\n return error;\n};\n\ntype SessionRouteErrorCode =\n | \"SESSION_NOT_FOUND\"\n | \"WORKFLOWS_REQUIRED\"\n | \"WORKFLOW_INSTANCE_MISSING\";\n\nconst isSessionRouteErrorCode = (value: unknown): value is SessionRouteErrorCode =>\n value === \"SESSION_NOT_FOUND\" ||\n value === \"WORKFLOWS_REQUIRED\" ||\n value === \"WORKFLOW_INSTANCE_MISSING\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst getArrayFromResult = <T>(result: unknown, key: string): T[] | null => {\n if (!isRecord(result)) {\n return null;\n }\n const value = result[key];\n return Array.isArray(value) ? (value as T[]) : null;\n};\n\nconst getAssistantFromResult = (result: unknown): AgentMessage | null => {\n if (!isRecord(result)) {\n return null;\n }\n const assistant = result[\"assistant\"];\n if (!assistant || typeof assistant !== \"object\") {\n return null;\n }\n return assistant as AgentMessage;\n};\n\nconst parseAssistantTurn = (name: string): number | null => {\n const match = /^assistant-(\\d+)$/.exec(name);\n return match ? Number.parseInt(match[1], 10) : null;\n};\n\nconst deriveHistory = (steps: PiWorkflowHistoryStep[], output: unknown) => {\n let messages: AgentMessage[] = [];\n const trace: AgentEvent[] = [];\n const summaries: PiTurnSummary[] = [];\n let lastAssistant: AgentMessage | null = null;\n\n const sortedSteps = [...steps].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n for (const step of sortedSteps) {\n if (!step.result) {\n continue;\n }\n\n const stepMessages = getArrayFromResult<AgentMessage>(step.result, \"messages\");\n if (stepMessages) {\n messages = stepMessages;\n }\n\n const stepTrace = getArrayFromResult<AgentEvent>(step.result, \"trace\");\n if (stepTrace) {\n trace.push(...stepTrace);\n }\n\n const assistant = getAssistantFromResult(step.result);\n const turn = parseAssistantTurn(step.name);\n if (assistant && turn !== null) {\n lastAssistant = assistant;\n summaries.push({\n turn,\n assistant,\n summary: extractAssistantTextFromMessage(assistant) || null,\n });\n }\n }\n\n if (messages.length === 0 && isRecord(output) && Array.isArray(output[\"messages\"])) {\n messages = output[\"messages\"] as AgentMessage[];\n }\n if (lastAssistant && !messages.some((message) => message?.role === \"assistant\")) {\n messages = [...messages, lastAssistant];\n }\n\n return { messages, trace, summaries };\n};\n\nconst collectHistorySteps = (\n pages: PiWorkflowsHistoryPage[],\n maxRunNumber: number,\n): PiWorkflowHistoryStep[] => {\n return pages.filter((page) => page.runNumber <= maxRunNumber).flatMap((page) => page.steps);\n};\n\nexport const piRoutesFactory = defineRoutes(piFragmentDefinition).create(\n ({ config, defineRoute, serviceDeps }) => {\n return [\n defineRoute({\n method: \"POST\",\n path: \"/sessions\",\n inputSchema: z.object({\n agent: z.string(),\n name: z.string().optional(),\n metadata: z.any().optional(),\n tags: z.array(z.string()).optional(),\n steeringMode: z.enum([\"all\", \"one-at-a-time\"]).optional(),\n }),\n outputSchema: sessionBaseSchema,\n errorCodes: [\"AGENT_NOT_FOUND\", \"WORKFLOWS_REQUIRED\", \"WORKFLOW_CREATE_FAILED\"],\n handler: async function ({ input }, { json, error }) {\n const values = await input.valid();\n\n const workflowsService = serviceDeps.workflows;\n if (!workflowsService) {\n return error(\n { message: \"Workflows service is required.\", code: \"WORKFLOWS_REQUIRED\" },\n { status: 500 },\n );\n }\n\n const agentName = values.agent;\n const agent = config.agents?.[agentName];\n if (!agent) {\n return error(\n { message: `Agent ${agentName} not found.`, code: \"AGENT_NOT_FOUND\" },\n { status: 404 },\n );\n }\n\n const now = new Date();\n const steeringMode = normalizeSteeringMode(\n values.steeringMode ?? config.defaultSteeringMode,\n );\n const sessionId = createId();\n\n try {\n const created = await this.handlerTx()\n .withServiceCalls(\n () =>\n [\n workflowsService.createInstance(PI_WORKFLOW_NAME, {\n id: sessionId,\n params: {\n sessionId,\n agentName,\n systemPrompt: agent.systemPrompt,\n initialMessages: [],\n },\n }),\n ] as const,\n )\n .mutate(({ forSchema }) => {\n const uow = forSchema(piSchema);\n uow.create(\"session\", {\n id: sessionId,\n name: values.name ?? null,\n agent: agentName,\n status: \"active\",\n workflowInstanceId: sessionId,\n steeringMode,\n metadata: values.metadata ?? null,\n tags: values.tags ?? null,\n createdAt: now,\n updatedAt: now,\n });\n })\n .transform(({ serviceResult }) => serviceResult[0])\n .execute();\n\n const workflowInstanceId = created.id;\n const workflowStatus = created.details;\n\n const session: PiSession = {\n id: sessionId,\n name: values.name ?? null,\n status: workflowStatus.status,\n agent: agentName,\n workflowInstanceId,\n steeringMode,\n metadata: values.metadata ?? null,\n tags: values.tags ?? [],\n createdAt: now,\n updatedAt: now,\n };\n\n return json(session);\n } catch (err) {\n // TODO: cleanup workflow/session if createInstance or session persist fails.\n const message =\n err instanceof Error ? err.message : \"Failed to create workflow instance.\";\n return error({ message, code: \"WORKFLOW_CREATE_FAILED\" }, { status: 500 });\n }\n },\n }),\n defineRoute({\n method: \"GET\",\n path: \"/sessions\",\n queryParameters: [\"limit\"],\n outputSchema: z.array(sessionBaseSchema),\n handler: async function ({ query }, { json }) {\n const limit = Number.parseInt(query.get(\"limit\") ?? `${DEFAULT_PAGE_SIZE}`, 10);\n const normalizedLimit = Number.isFinite(limit)\n ? Math.max(1, Math.min(MAX_PAGE_SIZE, limit))\n : DEFAULT_PAGE_SIZE;\n\n const [sessions] = await this.handlerTx()\n .retrieve(({ forSchema }) => {\n const uow = forSchema(piSchema);\n return uow.find(\"session\", (b) =>\n b\n .whereIndex(\"idx_session_created\")\n .orderByIndex(\"idx_session_created\", \"desc\")\n .pageSize(normalizedLimit),\n );\n })\n .execute();\n\n // TODO: hydrate workflow status without additional handlerTx calls.\n const outputs = sessions.map(toSessionOutput);\n return json(outputs);\n },\n }),\n defineRoute({\n method: \"GET\",\n path: \"/sessions/:sessionId\",\n outputSchema: sessionDetailSchema,\n errorCodes: [\"SESSION_NOT_FOUND\", \"WORKFLOWS_REQUIRED\", \"WORKFLOW_INSTANCE_MISSING\"],\n handler: async function ({ pathParams }, { json, error }) {\n const sessionId = pathParams.sessionId;\n\n const workflowsService = serviceDeps.workflows;\n if (!workflowsService) {\n return error(\n { message: \"Workflows service is required.\", code: \"WORKFLOWS_REQUIRED\" },\n { status: 500 },\n );\n }\n\n const workflowName = PI_WORKFLOW_NAME;\n\n try {\n const [sessionRow] = await this.handlerTx()\n .retrieve(({ forSchema }) => {\n const uow = forSchema(piSchema);\n return uow.findFirst(\"session\", (b) =>\n b.whereIndex(\"primary\", (eb) => eb(\"id\", \"=\", sessionId)),\n );\n })\n .execute();\n\n if (!sessionRow) {\n throw createRouteError(\"SESSION_NOT_FOUND\", `Session ${sessionId} not found.`, 404);\n }\n\n const workflowInstanceId = sessionRow.workflowInstanceId;\n if (!workflowInstanceId) {\n throw createRouteError(\"SESSION_NOT_FOUND\", `Session ${sessionId} not found.`, 404);\n }\n\n const result = await this.handlerTx()\n .withServiceCalls(() => {\n const historyCalls = Array.from({ length: MAX_HISTORY_RUNS + 1 }, (_, runNumber) =>\n workflowsService.listHistory({\n workflowName,\n instanceId: workflowInstanceId,\n runNumber,\n }),\n );\n return [\n workflowsService.getInstanceStatus(workflowName, workflowInstanceId),\n workflowsService.getInstanceRunNumber(workflowName, workflowInstanceId),\n ...historyCalls,\n ];\n })\n .mutate(({ forSchema, serviceIntermediateResult }) => {\n const [workflowStatus] = serviceIntermediateResult as [\n PiWorkflowsInstanceStatus,\n number,\n ...PiWorkflowsHistoryPage[],\n ];\n const uow = forSchema(piSchema);\n uow.update(\"session\", sessionRow.id, (b) =>\n b\n .set({\n status: workflowStatus.status,\n updatedAt: new Date(),\n })\n .check(),\n );\n })\n .transform(({ serviceResult }) => {\n const [workflowStatus, runNumber, ...historyPages] = serviceResult as [\n PiWorkflowsInstanceStatus,\n number,\n ...PiWorkflowsHistoryPage[],\n ];\n\n const maxRunNumber = Number.isFinite(runNumber)\n ? Math.max(0, Math.min(MAX_HISTORY_RUNS, runNumber))\n : 0;\n const pages = historyPages.slice(0, maxRunNumber + 1);\n const steps = collectHistorySteps(pages, maxRunNumber);\n const history = deriveHistory(steps, workflowStatus.output);\n\n return { workflowStatus, history };\n })\n .execute();\n\n const session = toSessionOutput(sessionRow);\n\n return json({\n ...session,\n status: result.workflowStatus.status,\n workflow: {\n status: result.workflowStatus.status,\n error: result.workflowStatus.error,\n output: result.workflowStatus.output,\n },\n messages: result.history.messages,\n trace: result.history.trace,\n summaries: result.history.summaries,\n });\n } catch (err) {\n if (err && typeof err === \"object\" && \"code\" in err && \"status\" in err) {\n const routeError = err as RouteError;\n const code = isSessionRouteErrorCode(routeError.code)\n ? routeError.code\n : \"WORKFLOW_INSTANCE_MISSING\";\n const status = code === \"SESSION_NOT_FOUND\" ? 404 : 500;\n return error({ message: routeError.message, code }, { status });\n }\n if (err instanceof Error && err.message === \"INSTANCE_NOT_FOUND\") {\n return error(\n { message: `Session ${sessionId} not found.`, code: \"SESSION_NOT_FOUND\" },\n { status: 404 },\n );\n }\n const message = err instanceof Error ? err.message : \"Failed to load workflow history.\";\n return error({ message, code: \"WORKFLOW_INSTANCE_MISSING\" }, { status: 500 });\n }\n },\n }),\n defineRoute({\n method: \"POST\",\n path: \"/sessions/:sessionId/messages\",\n inputSchema: z.object({\n text: z.string(),\n done: z.boolean().optional(),\n steeringMode: z.enum([\"all\", \"one-at-a-time\"]).optional(),\n }),\n outputSchema: messageAckSchema,\n errorCodes: [\"SESSION_NOT_FOUND\", \"WORKFLOWS_REQUIRED\", \"WORKFLOW_INSTANCE_MISSING\"],\n handler: async function ({ input, pathParams }, { json, error }) {\n const values = await input.valid();\n const sessionId = pathParams.sessionId;\n\n const workflowsService = serviceDeps.workflows;\n if (!workflowsService) {\n return error(\n { message: \"Workflows service is required.\", code: \"WORKFLOWS_REQUIRED\" },\n { status: 500 },\n );\n }\n\n const workflowName = PI_WORKFLOW_NAME;\n const payload: {\n text: string;\n done?: boolean;\n steeringMode?: \"all\" | \"one-at-a-time\";\n } = {\n text: values.text,\n done: values.done,\n };\n if (values.steeringMode) {\n payload.steeringMode = values.steeringMode;\n }\n\n try {\n const [sessionRow] = await this.handlerTx()\n .retrieve(({ forSchema }) => {\n const uow = forSchema(piSchema);\n return uow.findFirst(\"session\", (b) =>\n b.whereIndex(\"primary\", (eb) => eb(\"id\", \"=\", sessionId)),\n );\n })\n .execute();\n\n if (!sessionRow) {\n throw createRouteError(\"SESSION_NOT_FOUND\", `Session ${sessionId} not found.`, 404);\n }\n\n const workflowInstanceId = sessionRow.workflowInstanceId;\n if (!workflowInstanceId) {\n throw createRouteError(\"SESSION_NOT_FOUND\", `Session ${sessionId} not found.`, 404);\n }\n\n if (!payload.steeringMode) {\n // Ensure workflow events use the session's steering mode when not overridden.\n payload.steeringMode = normalizeSteeringMode(\n sessionRow.steeringMode ?? config.defaultSteeringMode,\n );\n }\n\n const result = await this.handlerTx()\n .withServiceCalls(() => [\n workflowsService.sendEvent(workflowName, workflowInstanceId, {\n type: \"user_message\",\n payload,\n }),\n workflowsService.getInstanceStatus(workflowName, workflowInstanceId),\n workflowsService.getInstanceRunNumber(workflowName, workflowInstanceId),\n ])\n .mutate(({ forSchema, serviceIntermediateResult }) => {\n const [, workflowStatus] = serviceIntermediateResult as [\n unknown,\n PiWorkflowsInstanceStatus,\n number,\n ];\n const updates: {\n updatedAt: Date;\n steeringMode?: \"all\" | \"one-at-a-time\";\n status?: string;\n } = {\n updatedAt: new Date(),\n };\n if (values.steeringMode) {\n updates.steeringMode = values.steeringMode;\n }\n updates.status = workflowStatus.status;\n const uow = forSchema(piSchema);\n uow.update(\"session\", sessionRow.id, (b) => b.set(updates).check());\n })\n .transform(({ serviceResult }) => {\n const [, workflowStatus, runNumber] = serviceResult as [\n unknown,\n PiWorkflowsInstanceStatus,\n number,\n ];\n return { workflowStatus, runNumber };\n })\n .execute();\n\n return json(\n {\n status: result.workflowStatus.status,\n },\n 202,\n );\n } catch (err) {\n if (err && typeof err === \"object\" && \"code\" in err && \"status\" in err) {\n const routeError = err as RouteError;\n const code = isSessionRouteErrorCode(routeError.code)\n ? routeError.code\n : \"WORKFLOW_INSTANCE_MISSING\";\n const status = code === \"SESSION_NOT_FOUND\" ? 404 : 500;\n return error({ message: routeError.message, code }, { status });\n }\n if (err instanceof Error && err.message === \"INSTANCE_NOT_FOUND\") {\n return error(\n { message: `Session ${sessionId} not found.`, code: \"SESSION_NOT_FOUND\" },\n { status: 404 },\n );\n }\n const message = err instanceof Error ? err.message : \"Failed to deliver message.\";\n return error({ message, code: \"WORKFLOW_INSTANCE_MISSING\" }, { status: 500 });\n }\n },\n }),\n ];\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { column, idColumn, schema } from "@fragno-dev/db/schema";
2
+
3
+ //#region src/schema.ts
4
+ const piSchema = schema("pi-fragment", (s) => {
5
+ return s.addTable("session", (t) => {
6
+ return t.addColumn("id", idColumn()).addColumn("name", column("string").nullable()).addColumn("agent", column("string")).addColumn("status", column("string")).addColumn("workflowInstanceId", column("string").nullable()).addColumn("steeringMode", column("string")).addColumn("metadata", column("json").nullable()).addColumn("tags", column("json").nullable()).addColumn("createdAt", column("timestamp").defaultTo((b) => b.now())).addColumn("updatedAt", column("timestamp").defaultTo((b) => b.now())).createIndex("idx_session_status", ["status"]).createIndex("idx_session_created", ["createdAt"]);
7
+ });
8
+ });
9
+
10
+ //#endregion
11
+ export { piSchema };
12
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../src/schema.ts"],"sourcesContent":["import { column, idColumn, schema } from \"@fragno-dev/db/schema\";\n\nexport const piSchema = schema(\"pi-fragment\", (s) => {\n return s.addTable(\"session\", (t) => {\n return (\n t\n .addColumn(\"id\", idColumn())\n .addColumn(\"name\", column(\"string\").nullable())\n .addColumn(\"agent\", column(\"string\"))\n // Possible statuses: active, paused, errored, terminated, complete, waiting.\n .addColumn(\"status\", column(\"string\"))\n .addColumn(\"workflowInstanceId\", column(\"string\").nullable())\n .addColumn(\"steeringMode\", column(\"string\"))\n .addColumn(\"metadata\", column(\"json\").nullable())\n .addColumn(\"tags\", column(\"json\").nullable())\n .addColumn(\n \"createdAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .addColumn(\n \"updatedAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .createIndex(\"idx_session_status\", [\"status\"])\n .createIndex(\"idx_session_created\", [\"createdAt\"])\n );\n });\n});\n"],"mappings":";;;AAEA,MAAa,WAAW,OAAO,gBAAgB,MAAM;AACnD,QAAO,EAAE,SAAS,YAAY,MAAM;AAClC,SACE,EACG,UAAU,MAAM,UAAU,CAAC,CAC3B,UAAU,QAAQ,OAAO,SAAS,CAAC,UAAU,CAAC,CAC9C,UAAU,SAAS,OAAO,SAAS,CAAC,CAEpC,UAAU,UAAU,OAAO,SAAS,CAAC,CACrC,UAAU,sBAAsB,OAAO,SAAS,CAAC,UAAU,CAAC,CAC5D,UAAU,gBAAgB,OAAO,SAAS,CAAC,CAC3C,UAAU,YAAY,OAAO,OAAO,CAAC,UAAU,CAAC,CAChD,UAAU,QAAQ,OAAO,OAAO,CAAC,UAAU,CAAC,CAC5C,UACC,aACA,OAAO,YAAY,CAAC,WAAW,MAAM,EAAE,KAAK,CAAC,CAC9C,CACA,UACC,aACA,OAAO,YAAY,CAAC,WAAW,MAAM,EAAE,KAAK,CAAC,CAC9C,CACA,YAAY,sBAAsB,CAAC,SAAS,CAAC,CAC7C,YAAY,uBAAuB,CAAC,YAAY,CAAC;GAEtD;EACF"}