@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.
Files changed (98) hide show
  1. package/README.md +39 -3
  2. package/dist/browser/client/react.d.ts +44 -36
  3. package/dist/browser/client/react.d.ts.map +1 -1
  4. package/dist/browser/client/react.js +105 -22
  5. package/dist/browser/client/react.js.map +1 -1
  6. package/dist/browser/client/solid.d.ts +42 -36
  7. package/dist/browser/client/solid.d.ts.map +1 -1
  8. package/dist/browser/client/solid.js +27 -13
  9. package/dist/browser/client/solid.js.map +1 -1
  10. package/dist/browser/client/svelte.d.ts +42 -36
  11. package/dist/browser/client/svelte.d.ts.map +1 -1
  12. package/dist/browser/client/svelte.js +14 -6
  13. package/dist/browser/client/svelte.js.map +1 -1
  14. package/dist/browser/client/vanilla.d.ts +99 -39
  15. package/dist/browser/client/vanilla.d.ts.map +1 -1
  16. package/dist/browser/client/vanilla.js +151 -3
  17. package/dist/browser/client/vanilla.js.map +1 -1
  18. package/dist/browser/client/vue.d.ts +54 -38
  19. package/dist/browser/client/vue.d.ts.map +1 -1
  20. package/dist/browser/client/vue.js +25 -17
  21. package/dist/browser/client/vue.js.map +1 -1
  22. package/dist/browser/{factory-DKoO_lRA.js → clients-BscY_HVe.js} +1051 -799
  23. package/dist/browser/clients-BscY_HVe.js.map +1 -0
  24. package/dist/browser/index.d.ts +3 -776
  25. package/dist/browser/index.js +801 -2
  26. package/dist/browser/index.js.map +1 -0
  27. package/dist/browser/routes-CpL_YGWK.d.ts +1560 -0
  28. package/dist/browser/routes-CpL_YGWK.d.ts.map +1 -0
  29. package/dist/cli/mod.d.ts.map +1 -1
  30. package/dist/cli/mod.js +245 -7
  31. package/dist/cli/mod.js.map +1 -1
  32. package/dist/node/{pi → client}/clients.d.ts +46 -36
  33. package/dist/node/client/clients.d.ts.map +1 -0
  34. package/dist/node/client/clients.js +54 -0
  35. package/dist/node/client/clients.js.map +1 -0
  36. package/dist/node/client/session-controller.d.ts +31 -0
  37. package/dist/node/client/session-controller.d.ts.map +1 -0
  38. package/dist/node/client/session-controller.js +33 -0
  39. package/dist/node/client/session-controller.js.map +1 -0
  40. package/dist/node/client/session-store.d.ts +71 -0
  41. package/dist/node/client/session-store.d.ts.map +1 -0
  42. package/dist/node/client/session-store.js +637 -0
  43. package/dist/node/client/session-store.js.map +1 -0
  44. package/dist/node/debug-log.d.ts +9 -0
  45. package/dist/node/debug-log.d.ts.map +1 -0
  46. package/dist/node/debug-log.js +58 -0
  47. package/dist/node/debug-log.js.map +1 -0
  48. package/dist/node/index.d.ts +5 -4
  49. package/dist/node/index.js +5 -3
  50. package/dist/node/pi/definition.d.ts +1 -1
  51. package/dist/node/pi/definition.d.ts.map +1 -1
  52. package/dist/node/pi/dsl.d.ts +5 -2
  53. package/dist/node/pi/dsl.d.ts.map +1 -1
  54. package/dist/node/pi/dsl.js +22 -3
  55. package/dist/node/pi/dsl.js.map +1 -1
  56. package/dist/node/pi/factory.d.ts +37 -34
  57. package/dist/node/pi/factory.d.ts.map +1 -1
  58. package/dist/node/pi/factory.js.map +1 -1
  59. package/dist/node/pi/mappers.js +0 -1
  60. package/dist/node/pi/mappers.js.map +1 -1
  61. package/dist/node/pi/route-schemas.js +42 -10
  62. package/dist/node/pi/route-schemas.js.map +1 -1
  63. package/dist/node/pi/types.d.ts +155 -7
  64. package/dist/node/pi/types.d.ts.map +1 -1
  65. package/dist/node/pi/types.js +6 -0
  66. package/dist/node/pi/types.js.map +1 -0
  67. package/dist/node/pi/workflow/active-session.d.ts +2 -0
  68. package/dist/node/pi/workflow/active-session.js +107 -0
  69. package/dist/node/pi/workflow/active-session.js.map +1 -0
  70. package/dist/node/pi/workflow/agent-runner.d.ts +13 -0
  71. package/dist/node/pi/workflow/agent-runner.d.ts.map +1 -0
  72. package/dist/node/pi/workflow/agent-runner.js +228 -0
  73. package/dist/node/pi/workflow/agent-runner.js.map +1 -0
  74. package/dist/node/pi/workflow/tool-journal.js +157 -0
  75. package/dist/node/pi/workflow/tool-journal.js.map +1 -0
  76. package/dist/node/pi/workflow/workflow.d.ts +29 -0
  77. package/dist/node/pi/workflow/workflow.d.ts.map +1 -0
  78. package/dist/node/pi/workflow/workflow.js +219 -0
  79. package/dist/node/pi/workflow/workflow.js.map +1 -0
  80. package/dist/node/routes.d.ts +38 -35
  81. package/dist/node/routes.d.ts.map +1 -1
  82. package/dist/node/routes.js +203 -132
  83. package/dist/node/routes.js.map +1 -1
  84. package/dist/node/schema.js +1 -1
  85. package/dist/node/schema.js.map +1 -1
  86. package/package.json +30 -29
  87. package/dist/browser/client-Bk-J98pf.d.ts +0 -679
  88. package/dist/browser/client-Bk-J98pf.d.ts.map +0 -1
  89. package/dist/browser/factory-DKoO_lRA.js.map +0 -1
  90. package/dist/browser/index.d.ts.map +0 -1
  91. package/dist/node/pi/clients.d.ts.map +0 -1
  92. package/dist/node/pi/clients.js +0 -18
  93. package/dist/node/pi/clients.js.map +0 -1
  94. package/dist/node/pi/workflow.d.ts +0 -31
  95. package/dist/node/pi/workflow.d.ts.map +0 -1
  96. package/dist/node/pi/workflow.js +0 -242
  97. package/dist/node/pi/workflow.js.map +0 -1
  98. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","names":[],"sources":["../../../src/client/session-store.ts"],"sourcesContent":["import { atom, computed, onMount, type ReadableAtom } from \"nanostores\";\n\nimport type { AgentEvent, AgentMessage } from \"@mariozechner/pi-agent-core\";\n\nimport type { PiSessionStatus } from \"../pi/constants\";\nimport type {\n PiActiveSessionProtocolMessage,\n PiAgentLoopPhase,\n PiAgentLoopWaitingFor,\n PiSessionDetail,\n} from \"../pi/types\";\n\ntype QueryStoreValue<T> = {\n loading: boolean;\n data?: T;\n error?: { message?: string };\n};\n\ntype QueryStore<T> = ReadableAtom<QueryStoreValue<T>> & {\n revalidate: () => void;\n};\n\ntype ToolResultContent = Extract<AgentMessage, { role: \"toolResult\" }>[\"content\"];\n\ntype OptimisticMessage = {\n clientId: string;\n message: AgentMessage;\n};\n\ntype LiveActivity =\n | { kind: \"none\" }\n | { kind: \"sending-message\" }\n | { kind: \"assistant-responding\" }\n | { kind: \"assistant-ready\" }\n | { kind: \"tool-running\"; toolName: string }\n | { kind: \"tool-updating\"; toolName: string }\n | { kind: \"tool-finished\"; toolName: string }\n | { kind: \"agent-started\" }\n | { kind: \"agent-finished\" }\n | { kind: \"turn-started\" }\n | { kind: \"turn-finished\" };\n\nexport type PiLiveToolExecution = {\n toolCallId: string;\n toolName: string;\n args: unknown;\n partialResult: unknown | null;\n};\n\nexport type PiSessionConnectionState =\n | \"idle\"\n | \"connecting\"\n | \"listening\"\n | \"reconnecting\"\n | \"error\";\n\ntype OverlayState = {\n sessionId: string;\n connection: PiSessionConnectionState;\n error: string | null;\n sendError: string | null;\n sending: boolean;\n activity: LiveActivity;\n pendingTurn: boolean;\n pendingSnapshotReconcile: boolean;\n readyForInputOverride: boolean | null;\n optimisticMessages: OptimisticMessage[];\n streamedMessages: AgentMessage[];\n draftAssistant: AgentMessage | null;\n runningTools: PiLiveToolExecution[];\n trace: AgentEvent[];\n};\n\ntype OverlayAction =\n | { type: \"snapshot-updated\"; sessionId: string }\n | { type: \"send-started\"; clientId: string; text: string }\n | { type: \"send-failed\"; clientId: string; message: string }\n | { type: \"send-acknowledged\" }\n | { type: \"stream-connecting\"; reconnecting: boolean }\n | { type: \"stream-open\" }\n | { type: \"stream-message\"; message: PiActiveSessionProtocolMessage }\n | { type: \"stream-settled\" }\n | { type: \"stream-inactive\" }\n | { type: \"stream-error\"; message: string }\n | { type: \"stream-idle\" };\n\nexport type PiSessionStoreState = {\n loading: boolean;\n session: PiSessionDetail | null;\n messages: AgentMessage[];\n traceEvents: AgentEvent[];\n runningTools: PiLiveToolExecution[];\n connection: PiSessionConnectionState;\n statusText: string | null;\n readyForInput: boolean;\n sending: boolean;\n error: string | null;\n sendError: string | null;\n};\n\nexport type CreatePiSessionStoreArgs = {\n sessionId: string;\n initialData?: PiSessionDetail | null;\n};\n\nexport type PiSessionStoreController = {\n store: ReadableAtom<PiSessionStoreState>;\n sendMessage: (input: {\n text: string;\n done?: boolean;\n steeringMode?: \"all\" | \"one-at-a-time\";\n }) => boolean;\n refetch: () => void;\n deactivate: () => void;\n destroy: () => void;\n};\n\nexport type CreatePiSessionStoreDependencies = {\n createDetailStore: (sessionId: string) => QueryStore<PiSessionDetail>;\n sendMessage: (options: {\n sessionId: string;\n text: string;\n done?: boolean;\n steeringMode?: \"all\" | \"one-at-a-time\";\n }) => Promise<{ status: PiSessionStatus }>;\n buildActiveUrl: (sessionId: string) => string;\n fetcher: typeof fetch;\n defaultOptions?: RequestInit;\n enableActiveStream?: boolean;\n activeLogger?: (event: string, details?: Record<string, unknown>) => void;\n};\n\nconst createOverlayState = (sessionId: string): OverlayState => ({\n sessionId,\n connection: \"idle\" as const,\n error: null,\n sendError: null,\n sending: false,\n activity: { kind: \"none\" as const },\n pendingTurn: false,\n pendingSnapshotReconcile: false,\n readyForInputOverride: null,\n optimisticMessages: [],\n streamedMessages: [],\n draftAssistant: null,\n runningTools: [],\n trace: [],\n});\n\nconst buildOptimisticUserMessage = (text: string): AgentMessage => ({\n role: \"user\",\n content: [{ type: \"text\", text }],\n timestamp: Date.now(),\n});\n\nconst formatJson = (value: unknown) => {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n};\n\nconst buildLiveToolResultMessage = (\n message: Extract<PiActiveSessionProtocolMessage, { layer: \"pi\"; type: \"event\" }>[\"event\"] & {\n type: \"tool_execution_end\";\n },\n): AgentMessage => {\n const result = message.result as {\n content?: ToolResultContent;\n details?: unknown;\n } | null;\n const content: ToolResultContent =\n result && Array.isArray(result.content)\n ? result.content\n : [{ type: \"text\", text: formatJson(message.result) }];\n\n return {\n role: \"toolResult\",\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n content,\n details: result?.details,\n isError: message.isError,\n timestamp: Date.now(),\n };\n};\n\nconst appendOrReplaceLiveMessage = (messages: AgentMessage[], nextMessage: AgentMessage) => {\n if (nextMessage.role === \"assistant\") {\n const existingIndex = messages.findIndex(\n (message) => message.role === \"assistant\" && message.timestamp === nextMessage.timestamp,\n );\n if (existingIndex >= 0) {\n return [\n ...messages.slice(0, existingIndex),\n nextMessage,\n ...messages.slice(existingIndex + 1),\n ];\n }\n }\n\n if (nextMessage.role === \"toolResult\") {\n const existingIndex = messages.findIndex(\n (message) => message.role === \"toolResult\" && message.toolCallId === nextMessage.toolCallId,\n );\n if (existingIndex >= 0) {\n return [\n ...messages.slice(0, existingIndex),\n nextMessage,\n ...messages.slice(existingIndex + 1),\n ];\n }\n }\n\n return [...messages, nextMessage];\n};\n\nconst mergeMessages = (\n snapshotMessages: AgentMessage[],\n optimisticMessages: AgentMessage[],\n streamedMessages: AgentMessage[],\n draftAssistant: AgentMessage | null,\n) => {\n let messages = [...snapshotMessages];\n\n for (const optimisticMessage of optimisticMessages) {\n messages = appendOrReplaceLiveMessage(messages, optimisticMessage);\n }\n\n for (const streamedMessage of streamedMessages) {\n messages = appendOrReplaceLiveMessage(messages, streamedMessage);\n }\n\n if (draftAssistant) {\n messages = appendOrReplaceLiveMessage(messages, draftAssistant);\n }\n\n return messages;\n};\n\nconst hasActiveOverlay = (\n state: Pick<OverlayState, \"draftAssistant\" | \"runningTools\" | \"streamedMessages\">,\n) =>\n state.draftAssistant !== null ||\n state.runningTools.length > 0 ||\n state.streamedMessages.length > 0;\n\nconst activityLabel = (activity: LiveActivity): string | null => {\n switch (activity.kind) {\n case \"none\":\n return null;\n case \"sending-message\":\n return \"Sending message\";\n case \"assistant-responding\":\n return \"Assistant responding\";\n case \"assistant-ready\":\n return \"Assistant response ready\";\n case \"tool-running\":\n return `Running ${activity.toolName}`;\n case \"tool-updating\":\n return `Updating ${activity.toolName}`;\n case \"tool-finished\":\n return `${activity.toolName} finished`;\n case \"agent-started\":\n return \"Agent started\";\n case \"agent-finished\":\n return \"Agent finished\";\n case \"turn-started\":\n return \"Turn started\";\n case \"turn-finished\":\n return \"Turn finished\";\n default:\n return null;\n }\n};\n\nconst connectionStatusText = (connection: PiSessionConnectionState): string | null => {\n switch (connection) {\n case \"connecting\":\n return \"Connecting to live updates\";\n case \"reconnecting\":\n return \"Reconnecting to live updates\";\n default:\n return null;\n }\n};\n\nconst reduceProtocolMessage = (state: OverlayState, message: PiActiveSessionProtocolMessage) => {\n if (message.layer === \"system\") {\n switch (message.type) {\n case \"snapshot\": {\n const readyForInput = isSessionReadyForInput(message.phase, message.waitingFor);\n return {\n ...state,\n error: null,\n activity: readyForInput ? { kind: \"none\" as const } : state.activity,\n pendingTurn: !readyForInput,\n readyForInputOverride: readyForInput,\n };\n }\n case \"inactive\":\n return {\n ...state,\n connection: \"idle\" as const,\n error: null,\n readyForInputOverride: false,\n };\n case \"settled\":\n return {\n ...state,\n connection: \"reconnecting\" as const,\n activity: { kind: \"turn-finished\" as const },\n pendingTurn: true,\n pendingSnapshotReconcile: true,\n readyForInputOverride: false,\n error: null,\n };\n default:\n return state;\n }\n }\n\n const event = message.event;\n const trace = [...state.trace, event];\n\n switch (event.type) {\n case \"message_start\":\n case \"message_update\":\n return {\n ...state,\n trace,\n draftAssistant: event.message,\n activity: { kind: \"assistant-responding\" as const },\n pendingTurn: true,\n error: null,\n };\n case \"message_end\":\n return {\n ...state,\n trace,\n streamedMessages: appendOrReplaceLiveMessage(state.streamedMessages, event.message),\n draftAssistant: null,\n activity: { kind: \"assistant-ready\" as const },\n pendingTurn: true,\n error: null,\n };\n case \"tool_execution_start\":\n return {\n ...state,\n trace,\n runningTools: [\n ...state.runningTools.filter((tool) => tool.toolCallId !== event.toolCallId),\n {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args,\n partialResult: null,\n },\n ],\n activity: { kind: \"tool-running\" as const, toolName: event.toolName },\n pendingTurn: true,\n error: null,\n };\n case \"tool_execution_update\":\n return {\n ...state,\n trace,\n runningTools: state.runningTools.map((tool) =>\n tool.toolCallId === event.toolCallId\n ? {\n ...tool,\n partialResult: event.partialResult,\n }\n : tool,\n ),\n activity: { kind: \"tool-updating\" as const, toolName: event.toolName },\n pendingTurn: true,\n error: null,\n };\n case \"tool_execution_end\":\n return {\n ...state,\n trace,\n streamedMessages: appendOrReplaceLiveMessage(\n state.streamedMessages,\n buildLiveToolResultMessage(event),\n ),\n runningTools: state.runningTools.filter((tool) => tool.toolCallId !== event.toolCallId),\n activity: { kind: \"tool-finished\" as const, toolName: event.toolName },\n pendingTurn: true,\n error: null,\n };\n case \"agent_start\":\n return {\n ...state,\n trace,\n activity: { kind: \"agent-started\" as const },\n pendingTurn: true,\n error: null,\n };\n case \"agent_end\":\n return {\n ...state,\n trace,\n activity: { kind: \"agent-finished\" as const },\n pendingTurn: true,\n error: null,\n };\n case \"turn_start\":\n return {\n ...state,\n trace,\n activity: { kind: \"turn-started\" as const },\n pendingTurn: true,\n error: null,\n };\n case \"turn_end\":\n return {\n ...state,\n trace,\n activity: { kind: \"turn-finished\" as const },\n pendingTurn: true,\n error: null,\n };\n default:\n return {\n ...state,\n trace,\n pendingTurn: true,\n error: null,\n };\n }\n};\n\nconst reduceOverlayState = (state: OverlayState, action: OverlayAction): OverlayState => {\n switch (action.type) {\n case \"snapshot-updated\": {\n if (action.sessionId !== state.sessionId) {\n return createOverlayState(action.sessionId);\n }\n\n if (!state.pendingSnapshotReconcile) {\n return {\n ...state,\n optimisticMessages: [],\n sendError: null,\n error: null,\n readyForInputOverride: null,\n };\n }\n\n return {\n ...state,\n optimisticMessages: [],\n streamedMessages: [],\n draftAssistant: null,\n runningTools: [],\n trace: [],\n error: null,\n sendError: null,\n activity: { kind: \"none\" as const },\n pendingTurn: false,\n pendingSnapshotReconcile: false,\n readyForInputOverride: null,\n };\n }\n case \"send-started\":\n return {\n ...state,\n sending: true,\n sendError: null,\n optimisticMessages: [\n ...state.optimisticMessages,\n {\n clientId: action.clientId,\n message: buildOptimisticUserMessage(action.text),\n },\n ],\n activity: { kind: \"sending-message\" as const },\n pendingTurn: true,\n readyForInputOverride: false,\n error: null,\n };\n case \"send-acknowledged\":\n return {\n ...state,\n sending: false,\n sendError: null,\n };\n case \"send-failed\": {\n const optimisticMessages = state.optimisticMessages.filter(\n (message) => message.clientId !== action.clientId,\n );\n const keepPending = state.pendingSnapshotReconcile || hasActiveOverlay(state);\n return {\n ...state,\n sending: false,\n sendError: action.message,\n optimisticMessages,\n activity: keepPending ? state.activity : { kind: \"none\" as const },\n pendingTurn: keepPending,\n readyForInputOverride: keepPending ? state.readyForInputOverride : null,\n };\n }\n case \"stream-connecting\": {\n const connection: PiSessionConnectionState = action.reconnecting\n ? \"reconnecting\"\n : \"connecting\";\n return {\n ...state,\n connection,\n error: null,\n };\n }\n case \"stream-open\":\n return {\n ...state,\n connection: \"listening\" as const,\n error: null,\n };\n case \"stream-message\":\n return reduceProtocolMessage(state, action.message);\n case \"stream-settled\":\n return {\n ...state,\n connection: \"reconnecting\" as const,\n };\n case \"stream-inactive\":\n return {\n ...state,\n connection: \"idle\" as const,\n error: null,\n };\n case \"stream-error\":\n return {\n ...state,\n connection: \"error\" as const,\n error: action.message,\n };\n case \"stream-idle\":\n return {\n ...state,\n connection: \"idle\" as const,\n error: null,\n activity: state.pendingTurn ? state.activity : { kind: \"none\" as const },\n };\n default:\n return state;\n }\n};\n\nconst readPiRouteError = async (response: Response): Promise<string> => {\n const text = await response.text();\n if (!text) {\n return `Request failed (${response.status}).`;\n }\n\n try {\n const parsed = JSON.parse(text) as { message?: string; error?: string };\n return parsed.message ?? parsed.error ?? text;\n } catch {\n return text;\n }\n};\n\nconst consumeProtocolStream = async (\n body: ReadableStream<Uint8Array>,\n onMessage: (message: PiActiveSessionProtocolMessage) => void,\n signal: AbortSignal,\n) => {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal.aborted) {\n await reader.cancel();\n return;\n }\n\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n onMessage(JSON.parse(trimmed) as PiActiveSessionProtocolMessage);\n }\n }\n\n const trailing = `${buffer}${decoder.decode()}`.trim();\n if (trailing) {\n onMessage(JSON.parse(trailing) as PiActiveSessionProtocolMessage);\n }\n } finally {\n reader.releaseLock();\n }\n};\n\nconst waitWithAbort = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", handleAbort);\n resolve();\n }, ms);\n\n function handleAbort() {\n clearTimeout(timeoutId);\n signal.removeEventListener(\"abort\", handleAbort);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n }\n\n if (signal.aborted) {\n handleAbort();\n return;\n }\n\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n });\n\nconst isSessionReadyForInput = (phase: PiAgentLoopPhase, waitingFor: PiAgentLoopWaitingFor) =>\n phase === \"waiting-for-user\" && waitingFor?.type === \"user_message\";\n\nconst shouldKeepLiveConnection = (session: PiSessionDetail | null) => session?.phase !== \"complete\";\n\nconst withAcceptHeader = (defaultOptions: RequestInit | undefined) => {\n const headers = new Headers(defaultOptions?.headers);\n headers.set(\"accept\", \"application/x-ndjson\");\n\n return {\n ...defaultOptions,\n headers,\n } satisfies RequestInit;\n};\n\nexport function createPiSessionStore(\n deps: CreatePiSessionStoreDependencies,\n args: CreatePiSessionStoreArgs,\n): PiSessionStoreController {\n const detailStore = deps.createDetailStore(args.sessionId);\n const snapshotStore = atom<PiSessionDetail | null>(args.initialData ?? null);\n const overlayStore = atom<OverlayState>(createOverlayState(args.sessionId));\n const lastSnapshotVersion = {\n current: args.initialData\n ? `${args.initialData.id}:${String(args.initialData.updatedAt)}`\n : null,\n };\n\n let destroyed = false;\n let mounted = false;\n let activeAbortController: AbortController | null = null;\n let activeLoopPromise: Promise<void> | null = null;\n let detailUnsubscribe: (() => void) | null = null;\n\n const logActive = (event: string, details?: Record<string, unknown>) => {\n deps.activeLogger?.(event, {\n sessionId: args.sessionId,\n ...details,\n });\n };\n\n const updateSnapshot = (session: PiSessionDetail | null | undefined) => {\n if (!session) {\n return;\n }\n\n snapshotStore.set(session);\n const nextVersion = `${session.id}:${String(session.updatedAt)}`;\n if (nextVersion !== lastSnapshotVersion.current) {\n logActive(\"snapshot:updated\", {\n version: nextVersion,\n phase: session.phase,\n status: session.status,\n turn: session.turn,\n });\n lastSnapshotVersion.current = nextVersion;\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), {\n type: \"snapshot-updated\",\n sessionId: session.id,\n }),\n );\n }\n };\n\n const refetch = () => {\n logActive(\"detail:refetch\");\n detailStore.revalidate();\n };\n\n const stopActiveLoop = () => {\n if (activeAbortController || activeLoopPromise) {\n logActive(\"stream:stop\");\n }\n activeAbortController?.abort();\n activeAbortController = null;\n activeLoopPromise = null;\n };\n\n const ensureActiveLoop = () => {\n if (destroyed || !mounted || activeLoopPromise || deps.enableActiveStream === false) {\n return;\n }\n\n const currentSession = snapshotStore.get();\n if (!shouldKeepLiveConnection(currentSession)) {\n logActive(\"stream:idle\", {\n reason: \"session-complete\",\n phase: currentSession?.phase ?? null,\n status: currentSession?.status ?? null,\n });\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-idle\" }));\n return;\n }\n\n logActive(\"stream:start\", {\n phase: currentSession?.phase ?? null,\n status: currentSession?.status ?? null,\n turn: currentSession?.turn ?? null,\n });\n\n const abortController = new AbortController();\n activeAbortController = abortController;\n activeLoopPromise = (async () => {\n let reconnecting = false;\n\n while (!abortController.signal.aborted && !destroyed) {\n const latestSession = snapshotStore.get();\n if (!shouldKeepLiveConnection(latestSession)) {\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-idle\" }));\n return;\n }\n\n const activeUrl = deps.buildActiveUrl(args.sessionId);\n logActive(\"stream:connecting\", {\n reconnecting,\n url: activeUrl,\n });\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), {\n type: \"stream-connecting\",\n reconnecting,\n }),\n );\n\n try {\n const response = await deps.fetcher(activeUrl, {\n ...withAcceptHeader(deps.defaultOptions),\n method: \"GET\",\n cache: \"no-store\",\n signal: abortController.signal,\n });\n\n logActive(\"stream:response\", {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n url: activeUrl,\n });\n\n if (!response.ok) {\n throw new Error(await readPiRouteError(response));\n }\n\n if (!response.body) {\n throw new Error(\"The active session stream did not return a response body.\");\n }\n\n logActive(\"stream:open\", { url: activeUrl });\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-open\" }));\n\n let sawInactive = false;\n let sawSettled = false;\n await consumeProtocolStream(\n response.body,\n (message) => {\n logActive(\"stream:message\", { message });\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), { type: \"stream-message\", message }),\n );\n if (message.layer === \"system\" && message.type === \"inactive\") {\n sawInactive = true;\n }\n if (message.layer === \"system\" && message.type === \"settled\") {\n sawSettled = true;\n }\n },\n abortController.signal,\n );\n\n if (abortController.signal.aborted || destroyed) {\n return;\n }\n\n if (sawSettled || sawInactive) {\n logActive(\"stream:settled\", {\n sawSettled,\n sawInactive,\n });\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-settled\" }));\n detailStore.revalidate();\n }\n\n if (sawInactive) {\n logActive(\"stream:inactive\");\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-inactive\" }));\n return;\n }\n\n reconnecting = true;\n logActive(\"stream:retry\", { delayMs: 250 });\n await waitWithAbort(250, abortController.signal);\n } catch (error) {\n if (abortController.signal.aborted || destroyed) {\n return;\n }\n\n const message =\n error instanceof Error ? error.message : \"Failed to stream the active session.\";\n logActive(\"stream:error\", { message });\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), { type: \"stream-error\", message }),\n );\n reconnecting = true;\n logActive(\"stream:retry\", { delayMs: 1000 });\n await waitWithAbort(1000, abortController.signal).catch(() => undefined);\n }\n }\n })().finally(() => {\n logActive(\"stream:end\");\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n if (activeLoopPromise) {\n activeLoopPromise = null;\n }\n });\n };\n\n const store = computed(\n [detailStore, snapshotStore, overlayStore],\n (detailValue, session, overlay) => {\n const optimisticMessages = overlay.optimisticMessages.map((entry) => entry.message);\n const snapshotMessages = session?.messages ?? [];\n const messages = mergeMessages(\n snapshotMessages,\n optimisticMessages,\n overlay.streamedMessages,\n overlay.draftAssistant,\n );\n\n const statusText =\n activityLabel(overlay.activity) ?? connectionStatusText(overlay.connection);\n const readyForInput =\n session !== null &&\n (overlay.readyForInputOverride ??\n (isSessionReadyForInput(session.phase, session.waitingFor) && !overlay.pendingTurn));\n\n return {\n loading: detailValue.loading,\n session,\n messages,\n traceEvents: [...(session?.trace ?? []), ...overlay.trace],\n runningTools: overlay.runningTools,\n connection: overlay.connection,\n statusText,\n readyForInput,\n sending: overlay.sending,\n error: detailValue.error?.message ?? overlay.error,\n sendError: overlay.sendError,\n } satisfies PiSessionStoreState;\n },\n );\n\n onMount(store, () => {\n mounted = true;\n logActive(\"store:mount\");\n updateSnapshot(detailStore.get().data);\n\n detailUnsubscribe = detailStore.listen((value) => {\n updateSnapshot(value.data);\n\n if (destroyed) {\n return;\n }\n\n if (!shouldKeepLiveConnection(snapshotStore.get())) {\n logActive(\"stream:idle\", {\n reason: \"detail-store-update\",\n });\n stopActiveLoop();\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"stream-idle\" }));\n return;\n }\n\n ensureActiveLoop();\n });\n\n ensureActiveLoop();\n\n return () => {\n logActive(\"store:unmount\");\n mounted = false;\n stopActiveLoop();\n detailUnsubscribe?.();\n detailUnsubscribe = null;\n };\n });\n\n const sendMessage: PiSessionStoreController[\"sendMessage\"] = (input) => {\n const text = input.text.trim();\n if (!text) {\n return false;\n }\n\n const current = store.get();\n if (current.sending || !current.readyForInput) {\n return false;\n }\n\n const clientId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n logActive(\"send:start\", { clientId, text });\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), { type: \"send-started\", clientId, text }),\n );\n ensureActiveLoop();\n\n void deps\n .sendMessage({\n sessionId: args.sessionId,\n text,\n done: input.done,\n steeringMode: input.steeringMode,\n })\n .then(() => {\n logActive(\"send:acknowledged\", { clientId });\n overlayStore.set(reduceOverlayState(overlayStore.get(), { type: \"send-acknowledged\" }));\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : \"Failed to send message.\";\n logActive(\"send:failed\", { clientId, message });\n overlayStore.set(\n reduceOverlayState(overlayStore.get(), { type: \"send-failed\", clientId, message }),\n );\n });\n\n return true;\n };\n\n const deactivate = () => {\n logActive(\"store:dispose\");\n mounted = false;\n stopActiveLoop();\n detailUnsubscribe?.();\n detailUnsubscribe = null;\n };\n\n const destroy = () => {\n if (destroyed) {\n return;\n }\n logActive(\"store:destroy\");\n destroyed = true;\n deactivate();\n };\n\n return {\n store,\n sendMessage,\n refetch,\n deactivate,\n destroy,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ //#region src/debug-log.d.ts
2
+ type PiLogLevel = "off" | "error" | "warn" | "info" | "debug";
3
+ type PiLoggerConfig = {
4
+ enabled?: boolean;
5
+ level?: PiLogLevel;
6
+ };
7
+ //#endregion
8
+ export { PiLoggerConfig };
9
+ //# sourceMappingURL=debug-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-log.d.ts","names":[],"sources":["../../src/debug-log.ts"],"mappings":";KAgBY,UAAA;AAAA,KAEA,cAAA;EACV,OAAA;EACA,KAAA,GAAQ,UAAA;AAAA"}
@@ -0,0 +1,58 @@
1
+ //#region src/debug-log.ts
2
+ const LOG_LEVEL_PRIORITY = {
3
+ off: 0,
4
+ error: 1,
5
+ warn: 2,
6
+ info: 3,
7
+ debug: 4
8
+ };
9
+ const DEFAULT_CONFIG = {
10
+ enabled: false,
11
+ level: "off"
12
+ };
13
+ var PiLogger = class PiLogger {
14
+ static #enabled = DEFAULT_CONFIG.enabled;
15
+ static #level = DEFAULT_CONFIG.level;
16
+ static reset() {
17
+ PiLogger.#enabled = DEFAULT_CONFIG.enabled;
18
+ PiLogger.#level = DEFAULT_CONFIG.level;
19
+ }
20
+ static configure(config) {
21
+ if (!config) return;
22
+ if (config.enabled !== void 0) PiLogger.#enabled = config.enabled;
23
+ if (config.level !== void 0) PiLogger.#level = config.level;
24
+ }
25
+ static enable() {
26
+ PiLogger.#enabled = true;
27
+ }
28
+ static disable() {
29
+ PiLogger.#enabled = false;
30
+ }
31
+ static setLogLevel(level) {
32
+ PiLogger.#level = level;
33
+ }
34
+ static debug(message, fields) {
35
+ PiLogger.#log("debug", message, fields);
36
+ }
37
+ static info(message, fields) {
38
+ PiLogger.#log("info", message, fields);
39
+ }
40
+ static warn(message, fields) {
41
+ PiLogger.#log("warn", message, fields);
42
+ }
43
+ static error(message, fields) {
44
+ PiLogger.#log("error", message, fields);
45
+ }
46
+ static #log(level, message, fields) {
47
+ if (!PiLogger.#enabled) return;
48
+ if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[PiLogger.#level]) return;
49
+ console[level](`[pi-fragment] ${message}`, {
50
+ at: (/* @__PURE__ */ new Date()).toISOString(),
51
+ ...fields
52
+ });
53
+ }
54
+ };
55
+
56
+ //#endregion
57
+ export { PiLogger };
58
+ //# sourceMappingURL=debug-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-log.js","names":["#enabled","#level","#log"],"sources":["../../src/debug-log.ts"],"sourcesContent":["type LogFields = Record<string, unknown>;\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LOG_LEVEL_PRIORITY: Record<PiLogLevel, number> = {\n off: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nconst DEFAULT_CONFIG: Required<PiLoggerConfig> = {\n enabled: false,\n level: \"off\",\n};\n\nexport type PiLogLevel = \"off\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type PiLoggerConfig = {\n enabled?: boolean;\n level?: PiLogLevel;\n};\n\nexport class PiLogger {\n static #enabled = DEFAULT_CONFIG.enabled;\n static #level: PiLogLevel = DEFAULT_CONFIG.level;\n\n static reset(): void {\n PiLogger.#enabled = DEFAULT_CONFIG.enabled;\n PiLogger.#level = DEFAULT_CONFIG.level;\n }\n\n static configure(config?: PiLoggerConfig): void {\n if (!config) {\n return;\n }\n if (config.enabled !== undefined) {\n PiLogger.#enabled = config.enabled;\n }\n if (config.level !== undefined) {\n PiLogger.#level = config.level;\n }\n }\n\n static enable(): void {\n PiLogger.#enabled = true;\n }\n\n static disable(): void {\n PiLogger.#enabled = false;\n }\n\n static setLogLevel(level: PiLogLevel): void {\n PiLogger.#level = level;\n }\n\n static debug(message: string, fields?: LogFields): void {\n PiLogger.#log(\"debug\", message, fields);\n }\n\n static info(message: string, fields?: LogFields): void {\n PiLogger.#log(\"info\", message, fields);\n }\n\n static warn(message: string, fields?: LogFields): void {\n PiLogger.#log(\"warn\", message, fields);\n }\n\n static error(message: string, fields?: LogFields): void {\n PiLogger.#log(\"error\", message, fields);\n }\n\n static #log(level: LogLevel, message: string, fields?: LogFields): void {\n if (!PiLogger.#enabled) {\n return;\n }\n if (LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY[PiLogger.#level]) {\n return;\n }\n\n console[level](`[pi-fragment] ${message}`, {\n at: new Date().toISOString(),\n ...fields,\n });\n }\n}\n"],"mappings":";AAGA,MAAM,qBAAiD;CACrD,KAAK;CACL,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAM,iBAA2C;CAC/C,SAAS;CACT,OAAO;CACR;AASD,IAAa,WAAb,MAAa,SAAS;CACpB,QAAOA,UAAW,eAAe;CACjC,QAAOC,QAAqB,eAAe;CAE3C,OAAO,QAAc;AACnB,YAASD,UAAW,eAAe;AACnC,YAASC,QAAS,eAAe;;CAGnC,OAAO,UAAU,QAA+B;AAC9C,MAAI,CAAC,OACH;AAEF,MAAI,OAAO,YAAY,OACrB,WAASD,UAAW,OAAO;AAE7B,MAAI,OAAO,UAAU,OACnB,WAASC,QAAS,OAAO;;CAI7B,OAAO,SAAe;AACpB,YAASD,UAAW;;CAGtB,OAAO,UAAgB;AACrB,YAASA,UAAW;;CAGtB,OAAO,YAAY,OAAyB;AAC1C,YAASC,QAAS;;CAGpB,OAAO,MAAM,SAAiB,QAA0B;AACtD,YAASC,IAAK,SAAS,SAAS,OAAO;;CAGzC,OAAO,KAAK,SAAiB,QAA0B;AACrD,YAASA,IAAK,QAAQ,SAAS,OAAO;;CAGxC,OAAO,KAAK,SAAiB,QAA0B;AACrD,YAASA,IAAK,QAAQ,SAAS,OAAO;;CAGxC,OAAO,MAAM,SAAiB,QAA0B;AACtD,YAASA,IAAK,SAAS,SAAS,OAAO;;CAGzC,QAAOA,IAAK,OAAiB,SAAiB,QAA0B;AACtE,MAAI,CAAC,UAASF,QACZ;AAEF,MAAI,mBAAmB,SAAS,mBAAmB,UAASC,OAC1D;AAGF,UAAQ,OAAO,iBAAiB,WAAW;GACzC,qBAAI,IAAI,MAAM,EAAC,aAAa;GAC5B,GAAG;GACJ,CAAC"}
@@ -1,10 +1,11 @@
1
- import { createPiFragmentClients } from "./pi/clients.js";
2
1
  import { PiSessionStatus, PiSteeringMode, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS } from "./pi/constants.js";
3
- import { PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiSession, PiToolFactory, PiToolFactoryContext, PiToolRegistry, PiTurnSummary, PiWorkflowHistoryStep, PiWorkflowsInstanceStatus, PiWorkflowsService } from "./pi/types.js";
4
- import { PI_WORKFLOW_NAME, PiWorkflowsRegistry, createPiWorkflows } from "./pi/workflow.js";
2
+ import { PI_WORKFLOW_NAME, PiWorkflowsRegistry, createPiWorkflows } from "./pi/workflow/workflow.js";
3
+ import { PI_TOOL_JOURNAL_VERSION, PiActiveSessionProtocolMessage, PiActiveSessionStreamItem, PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiPersistedToolCall, PiPersistedToolCallSource, PiPersistedToolResult, PiSession, PiSessionDetail, PiToolFactory, PiToolFactoryContext, PiToolRegistry, PiToolReplayCache, PiToolReplayContext, PiToolSideEffectReducer, PiToolSideEffectReducerContext, PiToolSideEffectReducerRegistry, PiTurnSummary, PiWorkflowHistoryStep, PiWorkflowsInstanceStatus, PiWorkflowsService } from "./pi/types.js";
4
+ import { CreatePiSessionStoreArgs, PiLiveToolExecution, PiSessionConnectionState, PiSessionStoreController, PiSessionStoreState, createPiSessionStore } from "./client/session-store.js";
5
+ import { createPiFragmentClients } from "./client/clients.js";
5
6
  import { PiAgentDefinitionInput, PiRuntime, createPi, defineAgent } from "./pi/dsl.js";
6
7
  import { piFragmentDefinition } from "./pi/definition.js";
7
8
  import { createPiFragment } from "./pi/factory.js";
8
9
  import { piRoutesFactory } from "./routes.js";
9
10
  import { FragnoRouteConfig } from "@fragno-dev/core";
10
- export { type FragnoRouteConfig, PI_WORKFLOW_NAME, type PiAgentDefinition, type PiAgentDefinitionInput, type PiAgentRegistry, type PiFragmentConfig, type PiRuntime, type PiSession, type PiSessionStatus, type PiSteeringMode, type PiToolFactory, type PiToolFactoryContext, type PiToolRegistry, type PiTurnSummary, type PiWorkflowHistoryStep, type PiWorkflowsInstanceStatus, type PiWorkflowsRegistry, type PiWorkflowsService, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS, createPi, createPiFragment, createPiFragmentClients, createPiWorkflows, defineAgent, piFragmentDefinition, piRoutesFactory };
11
+ export { type CreatePiSessionStoreArgs, type FragnoRouteConfig, PI_TOOL_JOURNAL_VERSION, PI_WORKFLOW_NAME, type PiActiveSessionProtocolMessage, type PiActiveSessionStreamItem, type PiAgentDefinition, type PiAgentDefinitionInput, type PiAgentRegistry, type PiFragmentConfig, type PiLiveToolExecution, type PiPersistedToolCall, type PiPersistedToolCallSource, type PiPersistedToolResult, type PiRuntime, type PiSession, type PiSessionConnectionState, type PiSessionDetail, type PiSessionStatus, type PiSessionStoreController, type PiSessionStoreState, type PiSteeringMode, type PiToolFactory, type PiToolFactoryContext, type PiToolRegistry, type PiToolReplayCache, type PiToolReplayContext, type PiToolSideEffectReducer, type PiToolSideEffectReducerContext, type PiToolSideEffectReducerRegistry, type PiTurnSummary, type PiWorkflowHistoryStep, type PiWorkflowsInstanceStatus, type PiWorkflowsRegistry, type PiWorkflowsService, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS, createPi, createPiFragment, createPiFragmentClients, createPiSessionStore, createPiWorkflows, defineAgent, piFragmentDefinition, piRoutesFactory };
@@ -1,9 +1,11 @@
1
1
  import { piFragmentDefinition } from "./pi/definition.js";
2
2
  import { SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS } from "./pi/constants.js";
3
- import { PI_WORKFLOW_NAME, createPiWorkflows } from "./pi/workflow.js";
3
+ import { PI_TOOL_JOURNAL_VERSION } from "./pi/types.js";
4
+ import { PI_WORKFLOW_NAME, createPiWorkflows } from "./pi/workflow/workflow.js";
4
5
  import { piRoutesFactory } from "./routes.js";
5
- import { createPiFragmentClients } from "./pi/clients.js";
6
+ import { createPiSessionStore } from "./client/session-store.js";
7
+ import { createPiFragmentClients } from "./client/clients.js";
6
8
  import { createPi, defineAgent } from "./pi/dsl.js";
7
9
  import { createPiFragment } from "./pi/factory.js";
8
10
 
9
- export { PI_WORKFLOW_NAME, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS, createPi, createPiFragment, createPiFragmentClients, createPiWorkflows, defineAgent, piFragmentDefinition, piRoutesFactory };
11
+ export { PI_TOOL_JOURNAL_VERSION, PI_WORKFLOW_NAME, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS, createPi, createPiFragment, createPiFragmentClients, createPiSessionStore, createPiWorkflows, defineAgent, piFragmentDefinition, piRoutesFactory };
@@ -5,7 +5,7 @@ import * as _fragno_dev_db_schema0 from "@fragno-dev/db/schema";
5
5
  import * as _fragno_dev_db_fragment_definition_builder0 from "@fragno-dev/db/fragment-definition-builder";
6
6
 
7
7
  //#region src/pi/definition.d.ts
8
- declare const piFragmentDefinition: _fragno_dev_core0.FragmentDefinition<PiFragmentConfig, _fragno_dev_db0.FragnoPublicConfigWithDatabase, _fragno_dev_db0.ImplicitDatabaseDependencies<_fragno_dev_db_schema0.Schema<Record<"session", _fragno_dev_db_schema0.Table<Record<string, _fragno_dev_db_schema0.AnyColumn> & Record<"id", _fragno_dev_db_schema0.IdColumn<"varchar(128)", string | _fragno_dev_db_schema0.FragnoId | null, _fragno_dev_db_schema0.FragnoId>> & Record<"name", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"agent", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"status", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"workflowInstanceId", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"steeringMode", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"metadata", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"tags", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"createdAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>> & Record<"updatedAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>>, Record<string, _fragno_dev_db_schema0.AnyRelation>, Record<string, _fragno_dev_db_schema0.Index<_fragno_dev_db_schema0.AnyColumn[], readonly string[]>> & Record<"idx_session_status", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"string", string, string>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["status"]>> & Record<"idx_session_created", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["createdAt"]>>>>>>, {}, {}, {
8
+ declare const piFragmentDefinition: _fragno_dev_core0.FragmentDefinition<PiFragmentConfig, _fragno_dev_db0.FragnoPublicConfigWithDatabase, _fragno_dev_db0.ImplicitDatabaseDependencies<_fragno_dev_db_schema0.Schema<Record<"session", _fragno_dev_db_schema0.Table<Record<"id", _fragno_dev_db_schema0.IdColumn<"varchar(128)", string | _fragno_dev_db_schema0.FragnoId | null, _fragno_dev_db_schema0.FragnoId>> & Record<"name", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"agent", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"status", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"steeringMode", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"metadata", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"tags", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"createdAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>> & Record<"updatedAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>>, Record<string, _fragno_dev_db_schema0.AnyRelation>, Record<string, _fragno_dev_db_schema0.Index<_fragno_dev_db_schema0.AnyColumn[], readonly string[]>> & Record<"idx_session_status", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"string", string, string>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["status"]>> & Record<"idx_session_created", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["createdAt"]>>>>>>, {}, {}, {
9
9
  workflows: PiWorkflowsService;
10
10
  }, {}, _fragno_dev_db0.DatabaseServiceContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db_fragment_definition_builder0.DatabaseRequestStorage, []>;
11
11
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","names":[],"sources":["../../../src/pi/definition.ts"],"mappings":";;;;;;;cAMa,oBAAA,oBAAoB,kBAAA,CAAA,gBAAA,EAAA,eAAA,CAAA,8BAAA,EAAA,eAAA,CAAA,4BAAA,CAAA,sBAAA,CAAA,MAAA,CAAA,MAAA,YAAA,sBAAA,CAAA,KAAA,CAAA,MAAA,SAAA,sBAAA,CAAA,SAAA,IAAA,MAAA,OAAA,sBAAA,CAAA,QAAA,0BAAA,sBAAA,CAAA,QAAA,SAAA,sBAAA,CAAA,QAAA,KAAA,MAAA,SAAA,sBAAA,CAAA,MAAA,4CAAA,MAAA,UAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,WAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,uBAAA,sBAAA,CAAA,MAAA,4CAAA,MAAA,iBAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,aAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,SAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,cAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,KAAA,MAAA,cAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,IAAA,MAAA,SAAA,sBAAA,CAAA,WAAA,GAAA,MAAA,SAAA,sBAAA,CAAA,KAAA,CAAA,sBAAA,CAAA,SAAA,0BAAA,MAAA,uBAAA,sBAAA,CAAA,KAAA,WAAA,sBAAA,CAAA,MAAA,8BAAA,sBAAA,CAAA,SAAA,4BAAA,MAAA,wBAAA,sBAAA,CAAA,KAAA,WAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,KAAA,sBAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"definition.d.ts","names":[],"sources":["../../../src/pi/definition.ts"],"mappings":";;;;;;;cAMa,oBAAA,oBAAoB,kBAAA,CAAA,gBAAA,EAAA,eAAA,CAAA,8BAAA,EAAA,eAAA,CAAA,4BAAA,CAAA,sBAAA,CAAA,MAAA,CAAA,MAAA,YAAA,sBAAA,CAAA,KAAA,CAAA,MAAA,OAAA,sBAAA,CAAA,QAAA,0BAAA,sBAAA,CAAA,QAAA,SAAA,sBAAA,CAAA,QAAA,KAAA,MAAA,SAAA,sBAAA,CAAA,MAAA,4CAAA,MAAA,UAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,WAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,iBAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,aAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,SAAA,sBAAA,CAAA,MAAA,8BAAA,MAAA,cAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,KAAA,MAAA,cAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,IAAA,MAAA,SAAA,sBAAA,CAAA,WAAA,GAAA,MAAA,SAAA,sBAAA,CAAA,KAAA,CAAA,sBAAA,CAAA,SAAA,0BAAA,MAAA,uBAAA,sBAAA,CAAA,KAAA,WAAA,sBAAA,CAAA,MAAA,8BAAA,sBAAA,CAAA,SAAA,4BAAA,MAAA,wBAAA,sBAAA,CAAA,KAAA,WAAA,sBAAA,CAAA,MAAA,eAAA,eAAA,CAAA,KAAA,GAAA,IAAA,UAAA,IAAA,KAAA,sBAAA,CAAA,SAAA"}
@@ -1,6 +1,6 @@
1
1
  import { PiSteeringMode } from "./constants.js";
2
- import { PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiToolFactory, PiToolRegistry } from "./types.js";
3
- import { PiWorkflowsRegistry } from "./workflow.js";
2
+ import { PiWorkflowsRegistry } from "./workflow/workflow.js";
3
+ import { PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiToolFactory, PiToolRegistry, PiToolSideEffectReducer, PiToolSideEffectReducerRegistry } from "./types.js";
4
4
 
5
5
  //#region src/pi/dsl.d.ts
6
6
  type PiAgentDefinitionInput = Omit<PiAgentDefinition, "name"> & {
@@ -16,7 +16,10 @@ declare const createPi: () => {
16
16
  agents(registry: PiAgentRegistry): /*elided*/any;
17
17
  tool(name: string, tool: PiToolFactory): /*elided*/any;
18
18
  tools(registry: PiToolRegistry): /*elided*/any;
19
+ toolSideEffectReducer(toolName: string, reducer: PiToolSideEffectReducer): /*elided*/any;
20
+ toolSideEffectReducers(registry: PiToolSideEffectReducerRegistry): /*elided*/any;
19
21
  defaultSteeringMode(mode: PiSteeringMode): /*elided*/any;
22
+ logging(config: PiFragmentConfig["logging"]): /*elided*/any;
20
23
  build(): PiRuntime;
21
24
  };
22
25
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"dsl.d.ts","names":[],"sources":["../../../src/pi/dsl.ts"],"mappings":";;;;;KAUY,sBAAA,GAAyB,IAAA,CAAK,iBAAA;EAA+B,IAAA;AAAA;AAAA,KAE7D,SAAA;EACV,MAAA,EAAQ,gBAAA;EACR,SAAA,EAAW,mBAAA;AAAA;AAAA,cAGA,WAAA,GACX,IAAA,UACA,UAAA,EAAY,sBAAA,KACX,iBAAA;AAAA,cAUU,QAAA;oBAMS,iBAAA,GA1BuD;mBA8BxD,eAAA,GA9BwD;qBAkCxD,IAAA,EAAQ,aAAA,GAhCR;kBAoCD,cAAA,GApCC;4BAwCS,cAAA,GAtCE;WA0CnB,SAAA;AAAA"}
1
+ {"version":3,"file":"dsl.d.ts","names":[],"sources":["../../../src/pi/dsl.ts"],"mappings":";;;;;KAYY,sBAAA,GAAyB,IAAA,CAAK,iBAAA;EAA+B,IAAA;AAAA;AAAA,KAE7D,SAAA;EACV,MAAA,EAAQ,gBAAA;EACR,SAAA,EAAW,mBAAA;AAAA;AAAA,cAGA,WAAA,GACX,IAAA,UACA,UAAA,EAAY,sBAAA,KACX,iBAAA;AAAA,cAUU,QAAA;oBAQS,iBAAA,GA5BuD;mBAgCxD,eAAA,GAhCwD;qBAoCxD,IAAA,EAAQ,aAAA,GAlCR;kBAsCD,cAAA,GAtCC;0CA0CqB,OAAA,EAAW,uBAAA,GAxCrB;mCA4CK,+BAAA,GA5CL;4BAgDF,cAAA,GAjD5B;kBAqDkB,gBAAA,cArDV;WAyDG,SAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- import { createPiWorkflows } from "./workflow.js";
1
+ import { createPiWorkflows } from "./workflow/workflow.js";
2
2
 
3
3
  //#region src/pi/dsl.ts
4
4
  const defineAgent = (name, definition) => {
@@ -11,7 +11,9 @@ const defineAgent = (name, definition) => {
11
11
  const createPi = () => {
12
12
  const agents = {};
13
13
  const tools = {};
14
+ const toolSideEffectReducers = {};
14
15
  let defaultSteeringMode;
16
+ let logging;
15
17
  const builder = {
16
18
  agent(definition) {
17
19
  agents[definition.name] = definition;
@@ -29,22 +31,39 @@ const createPi = () => {
29
31
  Object.assign(tools, registry);
30
32
  return builder;
31
33
  },
34
+ toolSideEffectReducer(toolName, reducer) {
35
+ toolSideEffectReducers[toolName] = reducer;
36
+ return builder;
37
+ },
38
+ toolSideEffectReducers(registry) {
39
+ Object.assign(toolSideEffectReducers, registry);
40
+ return builder;
41
+ },
32
42
  defaultSteeringMode(mode) {
33
43
  defaultSteeringMode = mode;
34
44
  return builder;
35
45
  },
46
+ logging(config) {
47
+ logging = config;
48
+ return builder;
49
+ },
36
50
  build() {
37
51
  const agentsSnapshot = { ...agents };
38
52
  const toolsSnapshot = { ...tools };
53
+ const reducersSnapshot = { ...toolSideEffectReducers };
39
54
  return {
40
55
  config: {
41
56
  agents: agentsSnapshot,
42
57
  tools: toolsSnapshot,
43
- defaultSteeringMode
58
+ defaultSteeringMode,
59
+ toolSideEffectReducers: reducersSnapshot,
60
+ logging
44
61
  },
45
62
  workflows: createPiWorkflows({
46
63
  agents: agentsSnapshot,
47
- tools: toolsSnapshot
64
+ tools: toolsSnapshot,
65
+ toolSideEffectReducers: reducersSnapshot,
66
+ logging
48
67
  })
49
68
  };
50
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dsl.js","names":[],"sources":["../../../src/pi/dsl.ts"],"sourcesContent":["import type {\n PiAgentDefinition,\n PiAgentRegistry,\n PiFragmentConfig,\n PiToolFactory,\n PiToolRegistry,\n} from \"./types\";\nimport type { PiSteeringMode } from \"./constants\";\nimport { createPiWorkflows, type PiWorkflowsRegistry } from \"./workflow\";\n\nexport type PiAgentDefinitionInput = Omit<PiAgentDefinition, \"name\"> & { name?: string };\n\nexport type PiRuntime = {\n config: PiFragmentConfig;\n workflows: PiWorkflowsRegistry;\n};\n\nexport const defineAgent = (\n name: string,\n definition: PiAgentDefinitionInput,\n): PiAgentDefinition => {\n if (definition.name && definition.name !== name) {\n throw new Error(`defineAgent name mismatch: expected ${name}, got ${definition.name}`);\n }\n return {\n ...definition,\n name,\n };\n};\n\nexport const createPi = () => {\n const agents: PiAgentRegistry = {};\n const tools: PiToolRegistry = {};\n let defaultSteeringMode: PiSteeringMode | undefined;\n\n const builder = {\n agent(definition: PiAgentDefinition) {\n agents[definition.name] = definition;\n return builder;\n },\n agents(registry: PiAgentRegistry) {\n Object.assign(agents, registry);\n return builder;\n },\n tool(name: string, tool: PiToolFactory) {\n tools[name] = tool;\n return builder;\n },\n tools(registry: PiToolRegistry) {\n Object.assign(tools, registry);\n return builder;\n },\n defaultSteeringMode(mode: PiSteeringMode) {\n defaultSteeringMode = mode;\n return builder;\n },\n build(): PiRuntime {\n const agentsSnapshot = { ...agents };\n const toolsSnapshot = { ...tools };\n const config: PiFragmentConfig = {\n agents: agentsSnapshot,\n tools: toolsSnapshot,\n defaultSteeringMode,\n };\n return {\n config,\n workflows: createPiWorkflows({ agents: agentsSnapshot, tools: toolsSnapshot }),\n };\n },\n };\n\n return builder;\n};\n"],"mappings":";;;AAiBA,MAAa,eACX,MACA,eACsB;AACtB,KAAI,WAAW,QAAQ,WAAW,SAAS,KACzC,OAAM,IAAI,MAAM,uCAAuC,KAAK,QAAQ,WAAW,OAAO;AAExF,QAAO;EACL,GAAG;EACH;EACD;;AAGH,MAAa,iBAAiB;CAC5B,MAAM,SAA0B,EAAE;CAClC,MAAM,QAAwB,EAAE;CAChC,IAAI;CAEJ,MAAM,UAAU;EACd,MAAM,YAA+B;AACnC,UAAO,WAAW,QAAQ;AAC1B,UAAO;;EAET,OAAO,UAA2B;AAChC,UAAO,OAAO,QAAQ,SAAS;AAC/B,UAAO;;EAET,KAAK,MAAc,MAAqB;AACtC,SAAM,QAAQ;AACd,UAAO;;EAET,MAAM,UAA0B;AAC9B,UAAO,OAAO,OAAO,SAAS;AAC9B,UAAO;;EAET,oBAAoB,MAAsB;AACxC,yBAAsB;AACtB,UAAO;;EAET,QAAmB;GACjB,MAAM,iBAAiB,EAAE,GAAG,QAAQ;GACpC,MAAM,gBAAgB,EAAE,GAAG,OAAO;AAMlC,UAAO;IACL,QAN+B;KAC/B,QAAQ;KACR,OAAO;KACP;KACD;IAGC,WAAW,kBAAkB;KAAE,QAAQ;KAAgB,OAAO;KAAe,CAAC;IAC/E;;EAEJ;AAED,QAAO"}
1
+ {"version":3,"file":"dsl.js","names":[],"sources":["../../../src/pi/dsl.ts"],"sourcesContent":["import type { PiSteeringMode } from \"./constants\";\nimport type {\n PiAgentDefinition,\n PiAgentRegistry,\n PiFragmentConfig,\n PiToolFactory,\n PiToolRegistry,\n PiToolSideEffectReducer,\n PiToolSideEffectReducerRegistry,\n} from \"./types\";\nimport { createPiWorkflows, type PiWorkflowsRegistry } from \"./workflow/workflow\";\n\nexport type PiAgentDefinitionInput = Omit<PiAgentDefinition, \"name\"> & { name?: string };\n\nexport type PiRuntime = {\n config: PiFragmentConfig;\n workflows: PiWorkflowsRegistry;\n};\n\nexport const defineAgent = (\n name: string,\n definition: PiAgentDefinitionInput,\n): PiAgentDefinition => {\n if (definition.name && definition.name !== name) {\n throw new Error(`defineAgent name mismatch: expected ${name}, got ${definition.name}`);\n }\n return {\n ...definition,\n name,\n };\n};\n\nexport const createPi = () => {\n const agents: PiAgentRegistry = {};\n const tools: PiToolRegistry = {};\n const toolSideEffectReducers: PiToolSideEffectReducerRegistry = {};\n let defaultSteeringMode: PiSteeringMode | undefined;\n let logging: PiFragmentConfig[\"logging\"];\n\n const builder = {\n agent(definition: PiAgentDefinition) {\n agents[definition.name] = definition;\n return builder;\n },\n agents(registry: PiAgentRegistry) {\n Object.assign(agents, registry);\n return builder;\n },\n tool(name: string, tool: PiToolFactory) {\n tools[name] = tool;\n return builder;\n },\n tools(registry: PiToolRegistry) {\n Object.assign(tools, registry);\n return builder;\n },\n toolSideEffectReducer(toolName: string, reducer: PiToolSideEffectReducer) {\n toolSideEffectReducers[toolName] = reducer;\n return builder;\n },\n toolSideEffectReducers(registry: PiToolSideEffectReducerRegistry) {\n Object.assign(toolSideEffectReducers, registry);\n return builder;\n },\n defaultSteeringMode(mode: PiSteeringMode) {\n defaultSteeringMode = mode;\n return builder;\n },\n logging(config: PiFragmentConfig[\"logging\"]) {\n logging = config;\n return builder;\n },\n build(): PiRuntime {\n const agentsSnapshot = { ...agents };\n const toolsSnapshot = { ...tools };\n const reducersSnapshot = { ...toolSideEffectReducers };\n const config: PiFragmentConfig = {\n agents: agentsSnapshot,\n tools: toolsSnapshot,\n defaultSteeringMode,\n toolSideEffectReducers: reducersSnapshot,\n logging,\n };\n return {\n config,\n workflows: createPiWorkflows({\n agents: agentsSnapshot,\n tools: toolsSnapshot,\n toolSideEffectReducers: reducersSnapshot,\n logging,\n }),\n };\n },\n };\n\n return builder;\n};\n"],"mappings":";;;AAmBA,MAAa,eACX,MACA,eACsB;AACtB,KAAI,WAAW,QAAQ,WAAW,SAAS,KACzC,OAAM,IAAI,MAAM,uCAAuC,KAAK,QAAQ,WAAW,OAAO;AAExF,QAAO;EACL,GAAG;EACH;EACD;;AAGH,MAAa,iBAAiB;CAC5B,MAAM,SAA0B,EAAE;CAClC,MAAM,QAAwB,EAAE;CAChC,MAAM,yBAA0D,EAAE;CAClE,IAAI;CACJ,IAAI;CAEJ,MAAM,UAAU;EACd,MAAM,YAA+B;AACnC,UAAO,WAAW,QAAQ;AAC1B,UAAO;;EAET,OAAO,UAA2B;AAChC,UAAO,OAAO,QAAQ,SAAS;AAC/B,UAAO;;EAET,KAAK,MAAc,MAAqB;AACtC,SAAM,QAAQ;AACd,UAAO;;EAET,MAAM,UAA0B;AAC9B,UAAO,OAAO,OAAO,SAAS;AAC9B,UAAO;;EAET,sBAAsB,UAAkB,SAAkC;AACxE,0BAAuB,YAAY;AACnC,UAAO;;EAET,uBAAuB,UAA2C;AAChE,UAAO,OAAO,wBAAwB,SAAS;AAC/C,UAAO;;EAET,oBAAoB,MAAsB;AACxC,yBAAsB;AACtB,UAAO;;EAET,QAAQ,QAAqC;AAC3C,aAAU;AACV,UAAO;;EAET,QAAmB;GACjB,MAAM,iBAAiB,EAAE,GAAG,QAAQ;GACpC,MAAM,gBAAgB,EAAE,GAAG,OAAO;GAClC,MAAM,mBAAmB,EAAE,GAAG,wBAAwB;AAQtD,UAAO;IACL,QAR+B;KAC/B,QAAQ;KACR,OAAO;KACP;KACA,wBAAwB;KACxB;KACD;IAGC,WAAW,kBAAkB;KAC3B,QAAQ;KACR,OAAO;KACP,wBAAwB;KACxB;KACD,CAAC;IACH;;EAEJ;AAED,QAAO"}
@@ -1,9 +1,10 @@
1
- import { PiFragmentConfig, PiWorkflowsService } from "./types.js";
1
+ import { PiActiveSessionProtocolMessage, PiFragmentConfig, PiWorkflowsService } from "./types.js";
2
2
  import * as _fragno_dev_core0 from "@fragno-dev/core";
3
3
  import * as _fragno_dev_db0 from "@fragno-dev/db";
4
4
  import { FragnoPublicConfigWithDatabase } from "@fragno-dev/db";
5
5
  import * as _fragno_dev_db_schema0 from "@fragno-dev/db/schema";
6
6
  import * as zod from "zod";
7
+ import * as _mariozechner_pi_agent_core0 from "@mariozechner/pi-agent-core";
7
8
  import * as zod_v4_core0 from "zod/v4/core";
8
9
  import * as _standard_schema_spec0 from "@standard-schema/spec";
9
10
  import * as _fragno_dev_db_fragment_definition_builder0 from "@fragno-dev/db/fragment-definition-builder";
@@ -15,6 +16,7 @@ type PiFragmentServices = {
15
16
  declare function createPiFragment(config: PiFragmentConfig, options: FragnoPublicConfigWithDatabase, services: PiFragmentServices): _fragno_dev_core0.FragnoInstantiatedFragment<readonly [_fragno_dev_core0.FragnoRouteConfig<"POST", "/sessions", zod.ZodObject<{
16
17
  agent: zod.ZodString;
17
18
  name: zod.ZodOptional<zod.ZodString>;
19
+ systemMessage: zod.ZodOptional<zod.ZodString>;
18
20
  metadata: zod.ZodOptional<zod.ZodAny>;
19
21
  tags: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
20
22
  steeringMode: zod.ZodOptional<zod.ZodEnum<{
@@ -33,7 +35,6 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
33
35
  waiting: "waiting";
34
36
  }>;
35
37
  agent: zod.ZodString;
36
- workflowInstanceId: zod.ZodNullable<zod.ZodString>;
37
38
  steeringMode: zod.ZodEnum<{
38
39
  all: "all";
39
40
  "one-at-a-time": "one-at-a-time";
@@ -42,7 +43,7 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
42
43
  tags: zod.ZodArray<zod.ZodString>;
43
44
  createdAt: zod.ZodDate;
44
45
  updatedAt: zod.ZodDate;
45
- }, zod_v4_core0.$strip>, "AGENT_NOT_FOUND" | "WORKFLOWS_REQUIRED" | "WORKFLOW_CREATE_FAILED", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>, _fragno_dev_core0.FragnoRouteConfig<"GET", "/sessions", _standard_schema_spec0.StandardSchemaV1<unknown, unknown> | undefined, zod.ZodArray<zod.ZodObject<{
46
+ }, zod_v4_core0.$strip>, "AGENT_NOT_FOUND" | "WORKFLOW_CREATE_FAILED", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>, _fragno_dev_core0.FragnoRouteConfig<"GET", "/sessions", _standard_schema_spec0.StandardSchemaV1<unknown, unknown> | undefined, zod.ZodArray<zod.ZodObject<{
46
47
  id: zod.ZodString;
47
48
  name: zod.ZodNullable<zod.ZodString>;
48
49
  status: zod.ZodEnum<{
@@ -54,7 +55,6 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
54
55
  waiting: "waiting";
55
56
  }>;
56
57
  agent: zod.ZodString;
57
- workflowInstanceId: zod.ZodNullable<zod.ZodString>;
58
58
  steeringMode: zod.ZodEnum<{
59
59
  all: "all";
60
60
  "one-at-a-time": "one-at-a-time";
@@ -75,7 +75,6 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
75
75
  waiting: "waiting";
76
76
  }>;
77
77
  agent: zod.ZodString;
78
- workflowInstanceId: zod.ZodNullable<zod.ZodString>;
79
78
  steeringMode: zod.ZodEnum<{
80
79
  all: "all";
81
80
  "one-at-a-time": "one-at-a-time";
@@ -105,20 +104,10 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
105
104
  type: zod.ZodLiteral<"text">;
106
105
  text: zod.ZodString;
107
106
  textSignature: zod.ZodOptional<zod.ZodString>;
108
- }, zod_v4_core0.$strip>, zod.ZodObject<{
109
- type: zod.ZodLiteral<"thinking">;
110
- thinking: zod.ZodString;
111
- thinkingSignature: zod.ZodOptional<zod.ZodString>;
112
107
  }, zod_v4_core0.$strip>, zod.ZodObject<{
113
108
  type: zod.ZodLiteral<"image">;
114
109
  data: zod.ZodString;
115
110
  mimeType: zod.ZodString;
116
- }, zod_v4_core0.$strip>, zod.ZodObject<{
117
- type: zod.ZodLiteral<"toolCall">;
118
- id: zod.ZodString;
119
- name: zod.ZodString;
120
- arguments: zod.ZodRecord<zod.ZodString, zod.ZodUnknown>;
121
- thoughtSignature: zod.ZodOptional<zod.ZodString>;
122
111
  }, zod_v4_core0.$strip>]>>]>;
123
112
  timestamp: zod.ZodNumber;
124
113
  }, zod_v4_core0.$strip>, zod.ZodObject<{
@@ -131,10 +120,6 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
131
120
  type: zod.ZodLiteral<"thinking">;
132
121
  thinking: zod.ZodString;
133
122
  thinkingSignature: zod.ZodOptional<zod.ZodString>;
134
- }, zod_v4_core0.$strip>, zod.ZodObject<{
135
- type: zod.ZodLiteral<"image">;
136
- data: zod.ZodString;
137
- mimeType: zod.ZodString;
138
123
  }, zod_v4_core0.$strip>, zod.ZodObject<{
139
124
  type: zod.ZodLiteral<"toolCall">;
140
125
  id: zod.ZodString;
@@ -159,7 +144,13 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
159
144
  total: zod.ZodNumber;
160
145
  }, zod_v4_core0.$strip>;
161
146
  }, zod_v4_core0.$strip>;
162
- stopReason: zod.ZodString;
147
+ stopReason: zod.ZodEnum<{
148
+ length: "length";
149
+ error: "error";
150
+ stop: "stop";
151
+ toolUse: "toolUse";
152
+ aborted: "aborted";
153
+ }>;
163
154
  errorMessage: zod.ZodOptional<zod.ZodString>;
164
155
  timestamp: zod.ZodNumber;
165
156
  }, zod_v4_core0.$strip>, zod.ZodObject<{
@@ -170,35 +161,47 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
170
161
  type: zod.ZodLiteral<"text">;
171
162
  text: zod.ZodString;
172
163
  textSignature: zod.ZodOptional<zod.ZodString>;
173
- }, zod_v4_core0.$strip>, zod.ZodObject<{
174
- type: zod.ZodLiteral<"thinking">;
175
- thinking: zod.ZodString;
176
- thinkingSignature: zod.ZodOptional<zod.ZodString>;
177
164
  }, zod_v4_core0.$strip>, zod.ZodObject<{
178
165
  type: zod.ZodLiteral<"image">;
179
166
  data: zod.ZodString;
180
167
  mimeType: zod.ZodString;
181
- }, zod_v4_core0.$strip>, zod.ZodObject<{
182
- type: zod.ZodLiteral<"toolCall">;
183
- id: zod.ZodString;
184
- name: zod.ZodString;
185
- arguments: zod.ZodRecord<zod.ZodString, zod.ZodUnknown>;
186
- thoughtSignature: zod.ZodOptional<zod.ZodString>;
187
168
  }, zod_v4_core0.$strip>]>>;
188
169
  details: zod.ZodOptional<zod.ZodUnknown>;
189
170
  isError: zod.ZodBoolean;
190
171
  timestamp: zod.ZodNumber;
191
172
  }, zod_v4_core0.$strip>]>>;
192
- trace: zod.ZodArray<zod.ZodObject<{
173
+ events: zod.ZodArray<zod.ZodObject<{
174
+ id: zod.ZodString;
175
+ runNumber: zod.ZodOptional<zod.ZodNullable<zod.ZodNumber>>;
193
176
  type: zod.ZodString;
194
- timestamp: zod.ZodOptional<zod.ZodNumber>;
177
+ payload: zod.ZodNullable<zod.ZodUnknown>;
178
+ createdAt: zod.ZodDate;
179
+ deliveredAt: zod.ZodNullable<zod.ZodDate>;
180
+ consumedByStepKey: zod.ZodNullable<zod.ZodString>;
195
181
  }, zod_v4_core0.$strip>>;
182
+ trace: zod.ZodArray<zod.ZodType<_mariozechner_pi_agent_core0.AgentEvent, unknown, zod_v4_core0.$ZodTypeInternals<_mariozechner_pi_agent_core0.AgentEvent, unknown>>>;
183
+ turn: zod.ZodNumber;
184
+ phase: zod.ZodEnum<{
185
+ complete: "complete";
186
+ "waiting-for-user": "waiting-for-user";
187
+ "running-agent": "running-agent";
188
+ }>;
189
+ waitingFor: zod.ZodNullable<zod.ZodUnion<readonly [zod.ZodObject<{
190
+ type: zod.ZodLiteral<"user_message">;
191
+ turn: zod.ZodNumber;
192
+ stepKey: zod.ZodString;
193
+ timeoutMs: zod.ZodNullable<zod.ZodNumber>;
194
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
195
+ type: zod.ZodLiteral<"assistant">;
196
+ turn: zod.ZodNumber;
197
+ stepKey: zod.ZodString;
198
+ }, zod_v4_core0.$strip>]>>;
196
199
  summaries: zod.ZodArray<zod.ZodObject<{
197
200
  turn: zod.ZodNumber;
198
201
  assistant: zod.ZodNullable<zod.ZodAny>;
199
202
  summary: zod.ZodNullable<zod.ZodString>;
200
203
  }, zod_v4_core0.$strip>>;
201
- }, zod_v4_core0.$strip>, "WORKFLOWS_REQUIRED" | "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>, _fragno_dev_core0.FragnoRouteConfig<"POST", "/sessions/:sessionId/messages", zod.ZodObject<{
204
+ }, zod_v4_core0.$strip>, "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", "events" | "trace" | "summaries", _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>, _fragno_dev_core0.FragnoRouteConfig<"GET", "/sessions/:sessionId/active", _standard_schema_spec0.StandardSchemaV1<unknown, unknown> | undefined, zod.ZodArray<zod.ZodType<PiActiveSessionProtocolMessage, unknown, zod_v4_core0.$ZodTypeInternals<PiActiveSessionProtocolMessage, unknown>>>, "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>, _fragno_dev_core0.FragnoRouteConfig<"POST", "/sessions/:sessionId/messages", zod.ZodObject<{
202
205
  text: zod.ZodString;
203
206
  done: zod.ZodOptional<zod.ZodBoolean>;
204
207
  steeringMode: zod.ZodOptional<zod.ZodEnum<{
@@ -214,7 +217,7 @@ declare function createPiFragment(config: PiFragmentConfig, options: FragnoPubli
214
217
  complete: "complete";
215
218
  waiting: "waiting";
216
219
  }>;
217
- }, zod_v4_core0.$strip>, "WORKFLOWS_REQUIRED" | "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>], _fragno_dev_db0.ImplicitDatabaseDependencies<_fragno_dev_db_schema0.Schema<Record<"session", _fragno_dev_db_schema0.Table<Record<string, _fragno_dev_db_schema0.AnyColumn> & Record<"id", _fragno_dev_db_schema0.IdColumn<"varchar(128)", string | _fragno_dev_db_schema0.FragnoId | null, _fragno_dev_db_schema0.FragnoId>> & Record<"name", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"agent", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"status", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"workflowInstanceId", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"steeringMode", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"metadata", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"tags", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"createdAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>> & Record<"updatedAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>>, Record<string, _fragno_dev_db_schema0.AnyRelation>, Record<string, _fragno_dev_db_schema0.Index<_fragno_dev_db_schema0.AnyColumn[], readonly string[]>> & Record<"idx_session_status", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"string", string, string>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["status"]>> & Record<"idx_session_created", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["createdAt"]>>>>>>, _fragno_dev_core0.BoundServices<{}>, _fragno_dev_db0.DatabaseServiceContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db_fragment_definition_builder0.DatabaseRequestStorage, FragnoPublicConfigWithDatabase>;
220
+ }, zod_v4_core0.$strip>, "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING" | "SESSION_NOT_READY", string, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>>], _fragno_dev_db0.ImplicitDatabaseDependencies<_fragno_dev_db_schema0.Schema<Record<"session", _fragno_dev_db_schema0.Table<Record<"id", _fragno_dev_db_schema0.IdColumn<"varchar(128)", string | _fragno_dev_db_schema0.FragnoId | null, _fragno_dev_db_schema0.FragnoId>> & Record<"name", _fragno_dev_db_schema0.Column<"string", string | null, string | null>> & Record<"agent", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"status", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"steeringMode", _fragno_dev_db_schema0.Column<"string", string, string>> & Record<"metadata", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"tags", _fragno_dev_db_schema0.Column<"json", unknown, unknown>> & Record<"createdAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>> & Record<"updatedAt", _fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>>, Record<string, _fragno_dev_db_schema0.AnyRelation>, Record<string, _fragno_dev_db_schema0.Index<_fragno_dev_db_schema0.AnyColumn[], readonly string[]>> & Record<"idx_session_status", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"string", string, string>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["status"]>> & Record<"idx_session_created", _fragno_dev_db_schema0.Index<readonly [_fragno_dev_db_schema0.Column<"timestamp", (_fragno_dev_db0.DbNow | Date) | null, Date>] & _fragno_dev_db_schema0.AnyColumn[], readonly ["createdAt"]>>>>>>, _fragno_dev_core0.BoundServices<{}>, _fragno_dev_db0.DatabaseServiceContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db0.DatabaseRequestContext<_fragno_dev_db0.HooksMap>, _fragno_dev_db_fragment_definition_builder0.DatabaseRequestStorage, FragnoPublicConfigWithDatabase>;
218
221
  //#endregion
219
222
  export { createPiFragment };
220
223
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","names":[],"sources":["../../../src/pi/factory.ts"],"mappings":";;;;;;;;;;;KAOK,kBAAA;EACH,SAAA,EAAW,kBAAA;AAAA;AAAA,iBAGG,gBAAA,CACd,MAAA,EAAQ,gBAAA,EACR,OAAA,EAAS,8BAAA,EACT,QAAA,EAAU,kBAAA,qBAAkB,0BAAA,6BAAA,iBAAA,0BAAA,SAAA;SAAA,GAAA,CAAA,SAAA;;;;;;;;;MAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;iOAAA,sBAAA,CAAA,gBAAA"}
1
+ {"version":3,"file":"factory.d.ts","names":[],"sources":["../../../src/pi/factory.ts"],"mappings":";;;;;;;;;;;;KAOK,kBAAA;EACH,SAAA,EAAW,kBAAA;AAAA;AAAA,iBAGG,gBAAA,CACd,MAAA,EAAQ,gBAAA,EACR,OAAA,EAAS,8BAAA,EACT,QAAA,EAAU,kBAAA,qBAAkB,0BAAA,6BAAA,iBAAA,0BAAA,SAAA;SAAA,GAAA,CAAA,SAAA;;;;;;;;;;MAAA,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;0MAAA,sBAAA,CAAA,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":[],"sources":["../../../src/pi/factory.ts"],"sourcesContent":["import { instantiate } from \"@fragno-dev/core\";\nimport type { FragnoPublicConfigWithDatabase } from \"@fragno-dev/db\";\n\nimport { piFragmentDefinition } from \"./definition\";\nimport { piRoutesFactory } from \"../routes\";\nimport type { PiFragmentConfig, PiWorkflowsService } from \"./types\";\n\ntype PiFragmentServices = {\n workflows: PiWorkflowsService;\n};\n\nexport function createPiFragment(\n config: PiFragmentConfig,\n options: FragnoPublicConfigWithDatabase,\n services: PiFragmentServices,\n) {\n return instantiate(piFragmentDefinition)\n .withConfig(config)\n .withRoutes([piRoutesFactory])\n .withOptions(options)\n .withServices(services)\n .build();\n}\n"],"mappings":";;;;;AAWA,SAAgB,iBACd,QACA,SACA,UACA;AACA,QAAO,YAAY,qBAAqB,CACrC,WAAW,OAAO,CAClB,WAAW,CAAC,gBAAgB,CAAC,CAC7B,YAAY,QAAQ,CACpB,aAAa,SAAS,CACtB,OAAO"}
1
+ {"version":3,"file":"factory.js","names":[],"sources":["../../../src/pi/factory.ts"],"sourcesContent":["import { instantiate } from \"@fragno-dev/core\";\nimport type { FragnoPublicConfigWithDatabase } from \"@fragno-dev/db\";\n\nimport { piRoutesFactory } from \"../routes\";\nimport { piFragmentDefinition } from \"./definition\";\nimport type { PiFragmentConfig, PiWorkflowsService } from \"./types\";\n\ntype PiFragmentServices = {\n workflows: PiWorkflowsService;\n};\n\nexport function createPiFragment(\n config: PiFragmentConfig,\n options: FragnoPublicConfigWithDatabase,\n services: PiFragmentServices,\n) {\n return instantiate(piFragmentDefinition)\n .withConfig(config)\n .withRoutes([piRoutesFactory])\n .withOptions(options)\n .withServices(services)\n .build();\n}\n"],"mappings":";;;;;AAWA,SAAgB,iBACd,QACA,SACA,UACA;AACA,QAAO,YAAY,qBAAqB,CACrC,WAAW,OAAO,CAClB,WAAW,CAAC,gBAAgB,CAAC,CAC7B,YAAY,QAAQ,CACpB,aAAa,SAAS,CACtB,OAAO"}
@@ -33,7 +33,6 @@ const toSessionOutput = (row) => {
33
33
  name: row.name ?? null,
34
34
  status: row.status,
35
35
  agent: row.agent ?? "unknown",
36
- workflowInstanceId: row.workflowInstanceId ?? null,
37
36
  steeringMode: normalizeSteeringMode(row.steeringMode),
38
37
  metadata: row.metadata ?? null,
39
38
  tags: normalizeTags(row.tags),
@@ -1 +1 @@
1
- {"version":3,"file":"mappers.js","names":[],"sources":["../../../src/pi/mappers.ts"],"sourcesContent":["import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\nimport type { TableToColumnValues } from \"@fragno-dev/db/query\";\n\nimport type { PiSteeringMode } from \"./constants\";\nimport { STEERING_MODES } from \"./constants\";\nimport type { PiSession } from \"./types\";\nimport { piSchema } from \"../schema\";\n\nconst toId = (value: { valueOf: () => string } | string | null | undefined): string | null => {\n if (!value) {\n return null;\n }\n if (typeof value === \"string\") {\n return value;\n }\n return value.valueOf();\n};\n\nconst normalizeSteeringMode = (value: unknown): PiSteeringMode => {\n return STEERING_MODES.includes(value as PiSteeringMode)\n ? (value as PiSteeringMode)\n : \"one-at-a-time\";\n};\n\nconst normalizeTags = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is string => typeof item === \"string\");\n};\n\nconst extractAssistantText = (messages: AgentMessage[]): string => {\n const lastAssistant = [...messages].reverse().find((message) => {\n return (\n typeof message === \"object\" &&\n message !== null &&\n \"role\" in message &&\n message.role === \"assistant\"\n );\n });\n\n if (!lastAssistant || typeof lastAssistant !== \"object\") {\n return \"\";\n }\n\n const content = (lastAssistant as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => typeof block === \"object\" && block !== null && block.type === \"text\")\n .map((block) => (block as { text?: string }).text ?? \"\")\n .join(\"\")\n .trim();\n};\n\nconst extractAssistantTextFromMessage = (message?: AgentMessage | null): string => {\n if (!message) {\n return \"\";\n }\n return extractAssistantText([message]);\n};\n\ntype SessionRow = TableToColumnValues<(typeof piSchema)[\"tables\"][\"session\"]>;\n\nconst toSessionOutput = (row: SessionRow): PiSession => {\n return {\n id: toId(row.id) ?? \"\",\n name: row.name ?? null,\n status: row.status as PiSession[\"status\"],\n agent: row.agent ?? \"unknown\",\n workflowInstanceId: row.workflowInstanceId ?? null,\n steeringMode: normalizeSteeringMode(row.steeringMode),\n metadata: row.metadata ?? null,\n tags: normalizeTags(row.tags),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n};\n\nexport {\n extractAssistantText,\n extractAssistantTextFromMessage,\n normalizeSteeringMode,\n normalizeTags,\n toId,\n toSessionOutput,\n};\n"],"mappings":";;;;AAQA,MAAM,QAAQ,UAAgF;AAC5F,KAAI,CAAC,MACH,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAO,MAAM,SAAS;;AAGxB,MAAM,yBAAyB,UAAmC;AAChE,QAAO,eAAe,SAAS,MAAwB,GAClD,QACD;;AAGN,MAAM,iBAAiB,UAA6B;AAClD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;AAEX,QAAO,MAAM,QAAQ,SAAyB,OAAO,SAAS,SAAS;;AAGzE,MAAM,wBAAwB,aAAqC;CACjE,MAAM,gBAAgB,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,YAAY;AAC9D,SACE,OAAO,YAAY,YACnB,YAAY,QACZ,UAAU,WACV,QAAQ,SAAS;GAEnB;AAEF,KAAI,CAAC,iBAAiB,OAAO,kBAAkB,SAC7C,QAAO;CAGT,MAAM,UAAW,cAAwC;AACzD,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAGT,QAAO,QACJ,QAAQ,UAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,SAAS,OAAO,CACvF,KAAK,UAAW,MAA4B,QAAQ,GAAG,CACvD,KAAK,GAAG,CACR,MAAM;;AAGX,MAAM,mCAAmC,YAA0C;AACjF,KAAI,CAAC,QACH,QAAO;AAET,QAAO,qBAAqB,CAAC,QAAQ,CAAC;;AAKxC,MAAM,mBAAmB,QAA+B;AACtD,QAAO;EACL,IAAI,KAAK,IAAI,GAAG,IAAI;EACpB,MAAM,IAAI,QAAQ;EAClB,QAAQ,IAAI;EACZ,OAAO,IAAI,SAAS;EACpB,oBAAoB,IAAI,sBAAsB;EAC9C,cAAc,sBAAsB,IAAI,aAAa;EACrD,UAAU,IAAI,YAAY;EAC1B,MAAM,cAAc,IAAI,KAAK;EAC7B,WAAW,IAAI;EACf,WAAW,IAAI;EAChB"}
1
+ {"version":3,"file":"mappers.js","names":[],"sources":["../../../src/pi/mappers.ts"],"sourcesContent":["import type { TableToColumnValues } from \"@fragno-dev/db/query\";\n\nimport type { AgentMessage } from \"@mariozechner/pi-agent-core\";\n\nimport { piSchema } from \"../schema\";\nimport type { PiSteeringMode } from \"./constants\";\nimport { STEERING_MODES } from \"./constants\";\nimport type { PiSession } from \"./types\";\n\nconst toId = (value: { valueOf: () => string } | string | null | undefined): string | null => {\n if (!value) {\n return null;\n }\n if (typeof value === \"string\") {\n return value;\n }\n return value.valueOf();\n};\n\nconst normalizeSteeringMode = (value: unknown): PiSteeringMode => {\n return STEERING_MODES.includes(value as PiSteeringMode)\n ? (value as PiSteeringMode)\n : \"one-at-a-time\";\n};\n\nconst normalizeTags = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is string => typeof item === \"string\");\n};\n\nconst extractAssistantText = (messages: AgentMessage[]): string => {\n const lastAssistant = [...messages].reverse().find((message) => {\n return (\n typeof message === \"object\" &&\n message !== null &&\n \"role\" in message &&\n message.role === \"assistant\"\n );\n });\n\n if (!lastAssistant || typeof lastAssistant !== \"object\") {\n return \"\";\n }\n\n const content = (lastAssistant as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => typeof block === \"object\" && block !== null && block.type === \"text\")\n .map((block) => (block as { text?: string }).text ?? \"\")\n .join(\"\")\n .trim();\n};\n\nconst extractAssistantTextFromMessage = (message?: AgentMessage | null): string => {\n if (!message) {\n return \"\";\n }\n return extractAssistantText([message]);\n};\n\ntype SessionRow = TableToColumnValues<(typeof piSchema)[\"tables\"][\"session\"]>;\n\nconst toSessionOutput = (row: SessionRow): PiSession => {\n const id = toId(row.id) ?? \"\";\n\n return {\n id,\n name: row.name ?? null,\n status: row.status as PiSession[\"status\"],\n agent: row.agent ?? \"unknown\",\n steeringMode: normalizeSteeringMode(row.steeringMode),\n metadata: row.metadata ?? null,\n tags: normalizeTags(row.tags),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n};\n\nexport {\n extractAssistantText,\n extractAssistantTextFromMessage,\n normalizeSteeringMode,\n normalizeTags,\n toId,\n toSessionOutput,\n};\n"],"mappings":";;;;AASA,MAAM,QAAQ,UAAgF;AAC5F,KAAI,CAAC,MACH,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAO,MAAM,SAAS;;AAGxB,MAAM,yBAAyB,UAAmC;AAChE,QAAO,eAAe,SAAS,MAAwB,GAClD,QACD;;AAGN,MAAM,iBAAiB,UAA6B;AAClD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;AAEX,QAAO,MAAM,QAAQ,SAAyB,OAAO,SAAS,SAAS;;AAGzE,MAAM,wBAAwB,aAAqC;CACjE,MAAM,gBAAgB,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,YAAY;AAC9D,SACE,OAAO,YAAY,YACnB,YAAY,QACZ,UAAU,WACV,QAAQ,SAAS;GAEnB;AAEF,KAAI,CAAC,iBAAiB,OAAO,kBAAkB,SAC7C,QAAO;CAGT,MAAM,UAAW,cAAwC;AACzD,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAGT,QAAO,QACJ,QAAQ,UAAU,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,SAAS,OAAO,CACvF,KAAK,UAAW,MAA4B,QAAQ,GAAG,CACvD,KAAK,GAAG,CACR,MAAM;;AAGX,MAAM,mCAAmC,YAA0C;AACjF,KAAI,CAAC,QACH,QAAO;AAET,QAAO,qBAAqB,CAAC,QAAQ,CAAC;;AAKxC,MAAM,mBAAmB,QAA+B;AAGtD,QAAO;EACL,IAHS,KAAK,IAAI,GAAG,IAAI;EAIzB,MAAM,IAAI,QAAQ;EAClB,QAAQ,IAAI;EACZ,OAAO,IAAI,SAAS;EACpB,cAAc,sBAAsB,IAAI,aAAa;EACrD,UAAU,IAAI,YAAY;EAC1B,MAAM,cAAc,IAAI,KAAK;EAC7B,WAAW,IAAI;EACf,WAAW,IAAI;EAChB"}