@fragno-dev/pi-fragment 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -3
- package/dist/browser/client/react.d.ts +44 -36
- package/dist/browser/client/react.d.ts.map +1 -1
- package/dist/browser/client/react.js +105 -22
- package/dist/browser/client/react.js.map +1 -1
- package/dist/browser/client/solid.d.ts +42 -36
- package/dist/browser/client/solid.d.ts.map +1 -1
- package/dist/browser/client/solid.js +27 -13
- package/dist/browser/client/solid.js.map +1 -1
- package/dist/browser/client/svelte.d.ts +42 -36
- package/dist/browser/client/svelte.d.ts.map +1 -1
- package/dist/browser/client/svelte.js +14 -6
- package/dist/browser/client/svelte.js.map +1 -1
- package/dist/browser/client/vanilla.d.ts +99 -39
- package/dist/browser/client/vanilla.d.ts.map +1 -1
- package/dist/browser/client/vanilla.js +151 -3
- package/dist/browser/client/vanilla.js.map +1 -1
- package/dist/browser/client/vue.d.ts +54 -38
- package/dist/browser/client/vue.d.ts.map +1 -1
- package/dist/browser/client/vue.js +25 -17
- package/dist/browser/client/vue.js.map +1 -1
- package/dist/browser/{factory-DKoO_lRA.js → clients-BscY_HVe.js} +1051 -799
- package/dist/browser/clients-BscY_HVe.js.map +1 -0
- package/dist/browser/index.d.ts +3 -776
- package/dist/browser/index.js +801 -2
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/routes-CpL_YGWK.d.ts +1560 -0
- package/dist/browser/routes-CpL_YGWK.d.ts.map +1 -0
- package/dist/cli/mod.d.ts.map +1 -1
- package/dist/cli/mod.js +245 -7
- package/dist/cli/mod.js.map +1 -1
- package/dist/node/{pi → client}/clients.d.ts +46 -36
- package/dist/node/client/clients.d.ts.map +1 -0
- package/dist/node/client/clients.js +54 -0
- package/dist/node/client/clients.js.map +1 -0
- package/dist/node/client/session-controller.d.ts +31 -0
- package/dist/node/client/session-controller.d.ts.map +1 -0
- package/dist/node/client/session-controller.js +33 -0
- package/dist/node/client/session-controller.js.map +1 -0
- package/dist/node/client/session-store.d.ts +71 -0
- package/dist/node/client/session-store.d.ts.map +1 -0
- package/dist/node/client/session-store.js +637 -0
- package/dist/node/client/session-store.js.map +1 -0
- package/dist/node/debug-log.d.ts +9 -0
- package/dist/node/debug-log.d.ts.map +1 -0
- package/dist/node/debug-log.js +58 -0
- package/dist/node/debug-log.js.map +1 -0
- package/dist/node/index.d.ts +5 -4
- package/dist/node/index.js +5 -3
- package/dist/node/pi/definition.d.ts +1 -1
- package/dist/node/pi/definition.d.ts.map +1 -1
- package/dist/node/pi/dsl.d.ts +5 -2
- package/dist/node/pi/dsl.d.ts.map +1 -1
- package/dist/node/pi/dsl.js +22 -3
- package/dist/node/pi/dsl.js.map +1 -1
- package/dist/node/pi/factory.d.ts +37 -34
- package/dist/node/pi/factory.d.ts.map +1 -1
- package/dist/node/pi/factory.js.map +1 -1
- package/dist/node/pi/mappers.js +0 -1
- package/dist/node/pi/mappers.js.map +1 -1
- package/dist/node/pi/route-schemas.js +42 -10
- package/dist/node/pi/route-schemas.js.map +1 -1
- package/dist/node/pi/types.d.ts +155 -7
- package/dist/node/pi/types.d.ts.map +1 -1
- package/dist/node/pi/types.js +6 -0
- package/dist/node/pi/types.js.map +1 -0
- package/dist/node/pi/workflow/active-session.d.ts +2 -0
- package/dist/node/pi/workflow/active-session.js +107 -0
- package/dist/node/pi/workflow/active-session.js.map +1 -0
- package/dist/node/pi/workflow/agent-runner.d.ts +13 -0
- package/dist/node/pi/workflow/agent-runner.d.ts.map +1 -0
- package/dist/node/pi/workflow/agent-runner.js +228 -0
- package/dist/node/pi/workflow/agent-runner.js.map +1 -0
- package/dist/node/pi/workflow/tool-journal.js +157 -0
- package/dist/node/pi/workflow/tool-journal.js.map +1 -0
- package/dist/node/pi/workflow/workflow.d.ts +29 -0
- package/dist/node/pi/workflow/workflow.d.ts.map +1 -0
- package/dist/node/pi/workflow/workflow.js +219 -0
- package/dist/node/pi/workflow/workflow.js.map +1 -0
- package/dist/node/routes.d.ts +38 -35
- package/dist/node/routes.d.ts.map +1 -1
- package/dist/node/routes.js +203 -132
- package/dist/node/routes.js.map +1 -1
- package/dist/node/schema.js +1 -1
- package/dist/node/schema.js.map +1 -1
- package/package.json +30 -29
- package/dist/browser/client-Bk-J98pf.d.ts +0 -679
- package/dist/browser/client-Bk-J98pf.d.ts.map +0 -1
- package/dist/browser/factory-DKoO_lRA.js.map +0 -1
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/node/pi/clients.d.ts.map +0 -1
- package/dist/node/pi/clients.js +0 -18
- package/dist/node/pi/clients.js.map +0 -1
- package/dist/node/pi/workflow.d.ts +0 -31
- package/dist/node/pi/workflow.d.ts.map +0 -1
- package/dist/node/pi/workflow.js +0 -242
- package/dist/node/pi/workflow.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["column","idColumn","schema","piSchema","s","addTable","t","addColumn","nullable","defaultTo","b","now","createIndex","TableToColumnValues","AgentMessage","piSchema","PiSteeringMode","STEERING_MODES","PiSession","toId","value","valueOf","normalizeSteeringMode","includes","normalizeTags","Array","isArray","filter","item","extractAssistantText","messages","lastAssistant","reverse","find","message","role","content","block","type","map","text","join","trim","extractAssistantTextFromMessage","SessionRow","toSessionOutput","row","id","name","status","agent","steeringMode","metadata","tags","createdAt","updatedAt","AgentMessage","PiActiveSessionReplayBuffer","PiActiveSessionState","PiActiveSessionSubscriber","PiActiveSessionUpdate","PiAgentLoopState","PiAgentLoopWaitingFor","WAIT_FOR_USER_TIMEOUT_MS","buildWaitingForUser","turn","NonNullable","type","stepKey","timeoutMs","getActiveSessionReplayBuffer","state","replayBuffer","activeSessionUpdatesByTurn","Array","isArray","structuredClone","createPiActiveSessionState","options","onReplayBufferChange","buffer","listeners","Set","updatesByTurn","Map","trimPreviousTurns","previousTurn","keys","delete","appendUpdate","update","existing","get","set","exportReplayBuffer","entries","sort","leftTurn","rightTurn","map","updates","syncReplayBuffer","importReplayBuffer","clear","entry","notify","listener","from","error","console","warn","updateType","subscribe","add","publishEvent","event","settleTurn","status","replayTurn","listenerCount","size","createInitialPiAgentLoopState","messages","events","trace","summaries","phase","waitingFor","ensurePiActiveSessionState","activeSession","TxResult","InstanceStatus","WorkflowsFragmentServices","WorkflowsHistory","WorkflowsHistoryStep","AgentEvent","AgentMessage","AgentOptions","AgentTool","StreamFn","ThinkingLevel","Api","ImageContent","Model","TextContent","PiLoggerConfig","PiSessionStatus","PiSteeringMode","PiWorkflowsRegistry","WorkflowsService","PiSession","id","name","status","agent","steeringMode","metadata","tags","createdAt","Date","updatedAt","PiTurnSummary","turn","assistant","summary","PiSessionDetailEvent","type","payload","deliveredAt","consumedByStepKey","runNumber","PiAgentLoopPhase","PiActiveSessionStreamItem","PiActiveSessionSettledStatus","PiActiveSessionUpdate","event","PiActiveSessionSubscriber","update","PiActiveSessionReplayBufferEntry","updates","PiActiveSessionReplayBuffer","PiActiveSessionState","subscribe","listener","publishEvent","settleTurn","replayTurn","exportReplayBuffer","importReplayBuffer","buffer","listenerCount","PiAgentLoopWaitingFor","stepKey","timeoutMs","PiAgentLoopSerializableState","messages","events","trace","summaries","phase","waitingFor","PiAgentLoopPersistedState","activeSessionUpdatesByTurn","PiSessionWorkflowStatus","error","message","output","PiSessionDetail","workflow","PiAgentLoopState","activeSession","PiWorkflowsInstanceStatus","PiWorkflowsHistoryPage","PiWorkflowHistoryStep","PiWorkflowsService","Pick","getInstanceStatusBatch","workflowName","instanceIds","PiAgentDefinition","systemPrompt","model","thinkingLevel","tools","toolConfig","maxTraceEvents","streamFn","convertToLlm","transformContext","getApiKey","thinkingBudgets","maxRetryDelayMs","onEvent","ctx","sessionId","turnId","PiAgentRegistry","Record","PI_TOOL_JOURNAL_VERSION","const","PiToolJournalVersion","PiToolCallStableKey","PiPersistedToolResult","content","Array","details","PiPersistedToolCallSource","PiPersistedToolCallV1","version","key","toolCallId","toolName","args","result","isError","source","capturedAt","seq","PiActiveSessionSystemMessage","layer","replayCount","reason","PiActiveSessionProtocolMessage","PiPersistedToolCall","PiToolReplayCache","Map","PiToolSideEffectReducerContext","PiToolSideEffectReducer","state","entry","PiToolSideEffectReducerRegistry","PiToolReplayContext","cache","journal","sideEffects","PiToolFactoryContext","session","replay","PiToolFactory","Promise","PiToolRegistry","PiFragmentConfig","agents","defaultSteeringMode","toolSideEffectReducers","logging","z","NonRetryableError","PI_TOOL_JOURNAL_VERSION","PiPersistedToolCall","PiPersistedToolResult","PiToolReplayContext","PiToolSideEffectReducerRegistry","isRecord","value","Record","TOOL_JOURNAL_FIELD","persistedToolResultContentSchema","union","object","type","literal","text","string","textSignature","optional","data","mimeType","persistedToolResultSchema","content","array","details","unknown","persistedToolCallSchema","version","key","sessionId","turnId","toolCallId","toolName","args","record","result","isError","boolean","source","enum","capturedAt","number","finite","seq","int","nonnegative","formatToolJournalIssueLocation","location","issue","ZodIssue","path","length","join","buildStableToolCallKey","compareToolJournalEntries","a","b","clonePersistedToolCall","entry","structuredClone","buildToolErrorResult","error","Error","message","String","extractToolErrorMessage","block","createPersistedToolCall","options","Date","now","parsePersistedToolCall","Array","isArray","parsed","safeParse","success","issues","parsePersistedToolJournal","assistantResult","stepName","raw","map","index","hydrateReplayCache","cache","entries","sorted","sort","has","set","reduceBashSideEffects","state","cwd","files","writes","deletes","deletedPaths","base","next","detailsFiles","Object","item","writeEntry","buildSideEffectState","reducers","bash","journal","values","reducer","replaySequenceByContext","WeakMap","takeNextReplaySequence","replayContext","current","get","createReplayContext","localCache","Map","sideEffects","maxSeq","reduce","max","NonRetryableError","Agent","AgentEvent","AgentMessage","AgentState","AgentTool","AssistantMessage","PiLogger","PiAgentDefinition","PiPersistedToolCall","PiPersistedToolResult","PiSession","PiToolFactory","PiToolFactoryContext","PiToolReplayContext","PiToolRegistry","buildStableToolCallKey","buildToolErrorResult","clonePersistedToolCall","createPersistedToolCall","extractToolErrorMessage","takeNextReplaySequence","AgentLoopParams","sessionId","agentName","systemPrompt","initialMessages","AgentStreamFn","NonNullable","AgentStreamFnArgs","Parameters","isAssistantLikeMessage","value","Array","isArray","role","content","stopReason","buildStreamErrorAssistantMessage","model","error","type","text","api","provider","id","usage","input","output","cacheRead","cacheWrite","totalTokens","cost","total","errorMessage","Error","message","String","timestamp","Date","now","wrapStreamFn","streamFn","args","stream","response","result","originalResult","bind","Promise","streamResultError","push","reason","undefined","resolveTool","name","factory","context","tool","wrapToolWithReplay","options","toolName","execute","toolCallId","params","signal","onUpdate","session","toolCallIdValue","key","turnId","replayEntry","replay","cache","get","journal","source","seq","debug","isError","structuredClone","argsSnapshot","Record","recordResult","entry","set","resolveTools","agent","tools","messages","toolNames","length","toolConfig","resolved","findLastAssistantMessage","findLast","m","createAgent","steeringMode","onEvent","event","trace","assistant","toolJournal","status","metadata","tags","createdAt","updatedAt","agentTools","initialState","Partial","thinkingLevel","convertToLlm","transformContext","getApiKey","thinkingBudgets","maxRetryDelayMs","setSteeringMode","unsubscribe","subscribe","console","warn","continue","state","stateError","map","runAgentTurn","z","HandlerTxContext","HooksMap","defineWorkflow","NonRetryableError","WorkflowEvent","WorkflowStep","WorkflowStepTx","WorkflowsRegistry","AgentEvent","AgentMessage","PiLogger","piSchema","PiSessionStatus","extractAssistantTextFromMessage","normalizeSteeringMode","PiActiveSessionState","PiAgentLoopPhase","PiAgentLoopState","PiAgentLoopWaitingFor","PiAgentRegistry","PiFragmentConfig","PiSessionDetailEvent","PiToolReplayContext","PiToolRegistry","PiToolSideEffectReducerRegistry","PiTurnSummary","createPiActiveSessionState","createInitialPiAgentLoopState","ensurePiActiveSessionState","runAgentTurn","AgentLoopParams","createReplayContext","hydrateReplayCache","parsePersistedToolJournal","PI_WORKFLOW_NAME","WorkflowsOptions","agents","tools","toolSideEffectReducers","logging","WAIT_FOR_USER_TIMEOUT","const","WAIT_FOR_USER_TIMEOUT_MS","agentLoopParamsSchema","ZodType","object","sessionId","string","agentName","systemPrompt","optional","initialMessages","array","custom","userMessageSchema","text","done","boolean","steeringMode","enum","LoopState","messages","events","trace","summaries","turn","phase","waitingFor","replayCache","activeSession","buildWaitingForUser","NonNullable","type","stepKey","timeoutMs","initLoopState","params","existingState","Array","isArray","Map","setPhase","loop","WorkflowContext","getState","setState","state","Partial","emitState","ctx","activeSessionUpdatesByTurn","exportReplayBuffer","mutateSessionStatus","forSchema","status","uow","update","builder","set","projectSessionStatus","tx","mutate","buildDetailEvent","event","payload","timestamp","Date","id","getTime","createdAt","deliveredAt","consumedByStepKey","buildTurnSummary","assistant","summary","parseAssistantStepResult","value","stepName","result","findLast","m","role","toolJournal","createPiAgentLoopWorkflow","options","name","schema","initialState","step","parse","agentDefinition","userEvent","waitForEvent","timeout","userPayload","userText","isDone","userResult","do","instanceId","userMessage","content","now","replay","cache","reducers","assistantStepName","traceLengthBeforeTurn","length","turnId","assistantResult","Awaited","ReturnType","retries","limit","delay","backoff","onTerminalError","agent","onEvent","agentEvent","publishEvent","error","Error","settleTurn","parsed","slice","PiWorkflowsRegistry","agentLoop","createPiWorkflows","reset","configure","PiSteeringMode","PiAgentDefinition","PiAgentRegistry","PiFragmentConfig","PiToolFactory","PiToolRegistry","PiToolSideEffectReducer","PiToolSideEffectReducerRegistry","createPiWorkflows","PiWorkflowsRegistry","PiAgentDefinitionInput","Omit","name","PiRuntime","config","workflows","defineAgent","definition","Error","createPi","agents","tools","toolSideEffectReducers","defaultSteeringMode","logging","builder","agent","registry","Object","assign","tool","toolSideEffectReducer","toolName","reducer","mode","build","agentsSnapshot","toolsSnapshot","reducersSnapshot","PiFragmentConfig","PiWorkflowsService","PiFragmentServices","workflows","createPiFragment","config","options","FragnoPublicConfigWithDatabase","services"],"sources":["../../src/schema.ts","../../src/pi/mappers.ts","../../src/pi/workflow/active-session.ts","../../src/pi/types.ts","../../src/pi/workflow/tool-journal.ts","../../src/pi/workflow/agent-runner.ts","../../src/pi/workflow/workflow.ts","../../src/pi/dsl.ts","../../src/pi/factory.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 // id is equal to the workflow's workflowInstanceId\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(\"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","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","import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\n\nimport type {\n PiActiveSessionReplayBuffer,\n PiActiveSessionState,\n PiActiveSessionSubscriber,\n PiActiveSessionUpdate,\n PiAgentLoopState,\n PiAgentLoopWaitingFor,\n} from \"../types\";\n\nconst WAIT_FOR_USER_TIMEOUT_MS = 60 * 60 * 1000;\n\nconst buildWaitingForUser = (turn: number): NonNullable<PiAgentLoopWaitingFor> => ({\n type: \"user_message\",\n turn,\n stepKey: `waitForEvent:wait-user-${turn}`,\n timeoutMs: WAIT_FOR_USER_TIMEOUT_MS,\n});\n\nconst getActiveSessionReplayBuffer = (state: PiAgentLoopState): PiActiveSessionReplayBuffer => {\n const replayBuffer = (state as { activeSessionUpdatesByTurn?: unknown })\n .activeSessionUpdatesByTurn;\n return Array.isArray(replayBuffer)\n ? structuredClone(replayBuffer as PiActiveSessionReplayBuffer)\n : [];\n};\n\nexport const createPiActiveSessionState = (options?: {\n replayBuffer?: PiActiveSessionReplayBuffer;\n onReplayBufferChange?: (buffer: PiActiveSessionReplayBuffer) => void;\n}): PiActiveSessionState => {\n const listeners = new Set<PiActiveSessionSubscriber>();\n const updatesByTurn = new Map<number, PiActiveSessionUpdate[]>();\n\n const trimPreviousTurns = (turn: number) => {\n for (const previousTurn of updatesByTurn.keys()) {\n if (previousTurn < turn - 1) {\n updatesByTurn.delete(previousTurn);\n }\n }\n };\n\n const appendUpdate = (turn: number, update: PiActiveSessionUpdate) => {\n const existing = updatesByTurn.get(turn) ?? [];\n updatesByTurn.set(turn, [...existing, structuredClone(update)]);\n trimPreviousTurns(turn);\n };\n\n const exportReplayBuffer = (): PiActiveSessionReplayBuffer =>\n structuredClone(\n [...updatesByTurn.entries()]\n .sort(([leftTurn], [rightTurn]) => leftTurn - rightTurn)\n .map(([turn, updates]) => ({ turn, updates })),\n );\n\n const syncReplayBuffer = () => {\n options?.onReplayBufferChange?.(exportReplayBuffer());\n };\n\n const importReplayBuffer = (buffer: PiActiveSessionReplayBuffer) => {\n updatesByTurn.clear();\n for (const entry of structuredClone(buffer)) {\n for (const update of entry.updates) {\n appendUpdate(entry.turn, update);\n }\n }\n syncReplayBuffer();\n };\n\n if (options?.replayBuffer) {\n importReplayBuffer(options.replayBuffer);\n }\n\n const notify = (update: PiActiveSessionUpdate) => {\n for (const listener of Array.from(listeners)) {\n try {\n listener(update);\n } catch (error) {\n console.warn(\"Pi active-session listener failed.\", { error, updateType: update.type });\n }\n }\n };\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n publishEvent(turn, event) {\n const update: PiActiveSessionUpdate = { type: \"event\", turn, event };\n appendUpdate(turn, update);\n syncReplayBuffer();\n notify(update);\n },\n settleTurn(turn, status) {\n const update: PiActiveSessionUpdate = { type: \"settled\", turn, status };\n appendUpdate(turn, update);\n syncReplayBuffer();\n notify(update);\n },\n replayTurn(turn) {\n return structuredClone(updatesByTurn.get(turn) ?? []);\n },\n exportReplayBuffer,\n importReplayBuffer,\n listenerCount: () => listeners.size,\n };\n};\n\nexport const createInitialPiAgentLoopState = (messages: AgentMessage[] = []): PiAgentLoopState => ({\n messages,\n events: [],\n trace: [],\n summaries: [],\n turn: 0,\n phase: \"waiting-for-user\",\n waitingFor: buildWaitingForUser(0),\n activeSessionUpdatesByTurn: [],\n});\n\nexport const ensurePiActiveSessionState = (state: PiAgentLoopState): PiActiveSessionState => {\n if (state.activeSession) {\n return state.activeSession;\n }\n\n const activeSession = createPiActiveSessionState({\n replayBuffer: getActiveSessionReplayBuffer(state),\n onReplayBufferChange: (replayBuffer) => {\n state.activeSessionUpdatesByTurn = replayBuffer;\n },\n });\n state.activeSessionUpdatesByTurn = activeSession.exportReplayBuffer();\n state.activeSession = activeSession;\n return activeSession;\n};\n","import type { TxResult } from \"@fragno-dev/db\";\nimport type {\n InstanceStatus,\n WorkflowsFragmentServices,\n WorkflowsHistory,\n WorkflowsHistoryStep,\n} from \"@fragno-dev/workflows\";\n\nimport type {\n AgentEvent,\n AgentMessage,\n AgentOptions,\n AgentTool,\n StreamFn,\n ThinkingLevel,\n} from \"@mariozechner/pi-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@mariozechner/pi-ai\";\n\nimport type { PiLoggerConfig } from \"../debug-log\";\nimport type { PiSessionStatus, PiSteeringMode } from \"./constants\";\nimport type { PiWorkflowsRegistry } from \"./workflow/workflow\";\n\nexport type WorkflowsService = WorkflowsFragmentServices<PiWorkflowsRegistry>;\n\nexport type PiSession = {\n id: string;\n name: string | null;\n status: PiSessionStatus;\n agent: string;\n steeringMode: PiSteeringMode;\n metadata: unknown;\n tags: string[];\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type PiTurnSummary = {\n turn: number;\n assistant: AgentMessage | null;\n summary: string | null;\n};\n\nexport type PiSessionDetailEvent = {\n id: string;\n type: string;\n payload: unknown | null;\n createdAt: Date;\n deliveredAt: Date | null;\n consumedByStepKey: string | null;\n runNumber?: number | null;\n};\n\nexport type PiAgentLoopPhase = \"waiting-for-user\" | \"running-agent\" | \"complete\";\n\nexport type PiActiveSessionStreamItem = AgentEvent;\n\nexport type PiActiveSessionSettledStatus = \"waiting-for-user\" | \"complete\" | \"errored\";\n\nexport type PiActiveSessionUpdate =\n | {\n type: \"event\";\n turn: number;\n event: PiActiveSessionStreamItem;\n }\n | {\n type: \"settled\";\n turn: number;\n status: PiActiveSessionSettledStatus;\n };\n\nexport type PiActiveSessionSubscriber = (update: PiActiveSessionUpdate) => void;\n\nexport type PiActiveSessionReplayBufferEntry = {\n turn: number;\n updates: PiActiveSessionUpdate[];\n};\n\nexport type PiActiveSessionReplayBuffer = PiActiveSessionReplayBufferEntry[];\n\nexport type PiActiveSessionState = {\n subscribe: (listener: PiActiveSessionSubscriber) => () => void;\n publishEvent: (turn: number, event: PiActiveSessionStreamItem) => void;\n settleTurn: (turn: number, status: PiActiveSessionSettledStatus) => void;\n replayTurn: (turn: number) => PiActiveSessionUpdate[];\n exportReplayBuffer: () => PiActiveSessionReplayBuffer;\n importReplayBuffer: (buffer: PiActiveSessionReplayBuffer) => void;\n listenerCount: () => number;\n};\n\nexport type PiAgentLoopWaitingFor =\n | {\n type: \"user_message\";\n turn: number;\n stepKey: string;\n timeoutMs: number | null;\n }\n | {\n type: \"assistant\";\n turn: number;\n stepKey: string;\n }\n | null;\n\nexport type PiAgentLoopSerializableState = {\n messages: AgentMessage[];\n events: PiSessionDetailEvent[];\n trace: AgentEvent[];\n summaries: PiTurnSummary[];\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n};\n\nexport type PiAgentLoopPersistedState = PiAgentLoopSerializableState & {\n activeSessionUpdatesByTurn: PiActiveSessionReplayBuffer;\n};\n\nexport type PiSessionWorkflowStatus = {\n status: PiSessionStatus;\n error?: { name: string; message: string };\n output?: unknown;\n};\n\nexport type PiSessionDetail = PiSession & {\n workflow: PiSessionWorkflowStatus;\n messages: AgentMessage[];\n events: PiSessionDetailEvent[];\n trace: AgentEvent[];\n summaries: PiTurnSummary[];\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n};\n\nexport type PiAgentLoopState = PiAgentLoopPersistedState & {\n activeSession?: PiActiveSessionState;\n};\n\nexport type PiWorkflowsInstanceStatus = InstanceStatus;\nexport type PiWorkflowsHistoryPage = WorkflowsHistory;\nexport type PiWorkflowHistoryStep = WorkflowsHistoryStep;\n\nexport type PiWorkflowsService = Pick<\n WorkflowsService,\n | \"createInstance\"\n | \"getInstanceStatus\"\n | \"getLiveInstanceState\"\n | \"restoreInstanceState\"\n | \"sendEvent\"\n> & {\n getInstanceStatusBatch?: (\n workflowName: string,\n instanceIds: string[],\n ) => TxResult<PiWorkflowsInstanceStatus[], PiWorkflowsInstanceStatus[]>;\n};\n\nexport type PiAgentDefinition = {\n name: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel?: ThinkingLevel;\n tools?: string[];\n toolConfig?: unknown;\n maxTraceEvents?: number;\n streamFn?: StreamFn;\n convertToLlm?: AgentOptions[\"convertToLlm\"];\n transformContext?: AgentOptions[\"transformContext\"];\n getApiKey?: AgentOptions[\"getApiKey\"];\n thinkingBudgets?: AgentOptions[\"thinkingBudgets\"];\n maxRetryDelayMs?: AgentOptions[\"maxRetryDelayMs\"];\n onEvent?: (event: AgentEvent, ctx: { sessionId: string; turnId: string }) => void;\n};\n\nexport type PiAgentRegistry = Record<string, PiAgentDefinition>;\n\nexport const PI_TOOL_JOURNAL_VERSION = 1 as const;\n\nexport type PiToolJournalVersion = typeof PI_TOOL_JOURNAL_VERSION;\n\nexport type PiToolCallStableKey = string;\n\nexport type PiPersistedToolResult = {\n content: Array<TextContent | ImageContent>;\n details: unknown;\n};\n\nexport type PiPersistedToolCallSource = \"executed\" | \"replay\";\n\nexport type PiPersistedToolCallV1 = {\n version: PiToolJournalVersion;\n key: PiToolCallStableKey;\n sessionId: string;\n turnId: string;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result: PiPersistedToolResult;\n isError: boolean;\n source: PiPersistedToolCallSource;\n capturedAt: number;\n seq: number;\n};\n\nexport type PiActiveSessionSystemMessage =\n | {\n layer: \"system\";\n type: \"snapshot\";\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n replayCount: number;\n }\n | {\n layer: \"system\";\n type: \"settled\";\n turn: number;\n status: PiActiveSessionSettledStatus;\n }\n | {\n layer: \"system\";\n type: \"inactive\";\n reason: \"session-complete\" | \"session-idle\";\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n };\n\nexport type PiActiveSessionProtocolMessage =\n | PiActiveSessionSystemMessage\n | {\n layer: \"pi\";\n type: \"event\";\n turn: number;\n source: \"replay\" | \"live\";\n event: PiActiveSessionStreamItem;\n };\n\nexport type PiPersistedToolCall = PiPersistedToolCallV1;\n\nexport type PiToolReplayCache = Map<PiToolCallStableKey, PiPersistedToolCall>;\n\nexport type PiToolSideEffectReducerContext = {\n key: PiToolCallStableKey;\n sessionId: string;\n turnId: string;\n};\n\nexport type PiToolSideEffectReducer = (\n state: unknown,\n entry: PiPersistedToolCall,\n ctx: PiToolSideEffectReducerContext,\n) => unknown;\n\nexport type PiToolSideEffectReducerRegistry = Record<string, PiToolSideEffectReducer>;\n\nexport type PiToolReplayContext = {\n cache: PiToolReplayCache;\n journal: PiPersistedToolCall[];\n sideEffects: Record<string, unknown>;\n};\n\nexport type PiToolFactoryContext = {\n session: PiSession;\n turnId: string;\n toolConfig: unknown;\n messages: AgentMessage[];\n replay: PiToolReplayContext;\n};\n\nexport type PiToolFactory =\n | AgentTool\n | ((ctx: PiToolFactoryContext) => AgentTool | Promise<AgentTool>);\n\nexport type PiToolRegistry = Record<string, PiToolFactory>;\n\nexport interface PiFragmentConfig {\n agents: PiAgentRegistry;\n tools: PiToolRegistry;\n defaultSteeringMode?: PiSteeringMode;\n toolSideEffectReducers?: PiToolSideEffectReducerRegistry;\n /**\n * Optional logging config for internal pi-fragment diagnostics.\n */\n logging?: PiLoggerConfig;\n}\n","import { z } from \"zod\";\n\nimport { NonRetryableError } from \"@fragno-dev/workflows\";\n\nimport {\n PI_TOOL_JOURNAL_VERSION,\n type PiPersistedToolCall,\n type PiPersistedToolResult,\n type PiToolReplayContext,\n type PiToolSideEffectReducerRegistry,\n} from \"../types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst TOOL_JOURNAL_FIELD = \"toolJournal\";\n\nconst persistedToolResultContentSchema = z.union([\n z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n textSignature: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"image\"),\n data: z.string(),\n mimeType: z.string(),\n }),\n]);\n\nconst persistedToolResultSchema = z.object({\n content: z.array(persistedToolResultContentSchema),\n details: z.unknown(),\n});\n\nconst persistedToolCallSchema = z.object({\n version: z.literal(PI_TOOL_JOURNAL_VERSION),\n key: z.string(),\n sessionId: z.string(),\n turnId: z.string(),\n toolCallId: z.string(),\n toolName: z.string(),\n args: z.record(z.string(), z.unknown()),\n result: persistedToolResultSchema,\n isError: z.boolean(),\n source: z.enum([\"executed\", \"replay\"]),\n capturedAt: z.number().finite(),\n seq: z.number().int().nonnegative(),\n});\n\nconst formatToolJournalIssueLocation = (location: string, issue: z.ZodIssue): string => {\n if (issue.path.length === 0) {\n return location;\n }\n\n return `${location}.${issue.path.join(\".\")}`;\n};\n\nexport const buildStableToolCallKey = (sessionId: string, turnId: string, toolCallId: string) =>\n `${sessionId}:${turnId}:${toolCallId}`;\n\nexport const compareToolJournalEntries = (a: PiPersistedToolCall, b: PiPersistedToolCall) =>\n a.seq !== b.seq ? a.seq - b.seq : a.capturedAt - b.capturedAt;\n\nexport const clonePersistedToolCall = (entry: PiPersistedToolCall): PiPersistedToolCall =>\n structuredClone(entry);\n\nexport const buildToolErrorResult = (error: unknown): PiPersistedToolResult => ({\n content: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }],\n details: {},\n});\n\nexport const extractToolErrorMessage = (result: PiPersistedToolResult): string => {\n for (const block of result.content) {\n if (block.type === \"text\") {\n return block.text;\n }\n }\n return \"Tool execution failed\";\n};\n\nexport const createPersistedToolCall = (options: {\n sessionId: string;\n turnId: string;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result: PiPersistedToolResult;\n isError: boolean;\n source: PiPersistedToolCall[\"source\"];\n seq: number;\n}): PiPersistedToolCall => ({\n version: PI_TOOL_JOURNAL_VERSION,\n key: buildStableToolCallKey(options.sessionId, options.turnId, options.toolCallId),\n sessionId: options.sessionId,\n turnId: options.turnId,\n toolCallId: options.toolCallId,\n toolName: options.toolName,\n args: options.args,\n result: options.result,\n isError: options.isError,\n source: options.source,\n capturedAt: Date.now(),\n seq: options.seq,\n});\n\nconst parsePersistedToolCall = (value: unknown, location: string): PiPersistedToolCall => {\n if (!isRecord(value) || Array.isArray(value)) {\n throw new NonRetryableError(`Invalid tool journal entry at ${location}.`);\n }\n\n if (value[\"version\"] !== PI_TOOL_JOURNAL_VERSION) {\n throw new NonRetryableError(\n `Unsupported tool journal version at ${location}: ${String(value[\"version\"])}`,\n );\n }\n\n const parsed = persistedToolCallSchema.safeParse(value);\n if (!parsed.success) {\n const issue = parsed.error.issues[0];\n throw new NonRetryableError(\n `Invalid tool journal entry at ${formatToolJournalIssueLocation(location, issue)}: ${issue.message}`,\n );\n }\n\n return parsed.data as PiPersistedToolCall;\n};\n\nexport const parsePersistedToolJournal = (\n assistantResult: unknown,\n stepName: string,\n): PiPersistedToolCall[] => {\n if (!isRecord(assistantResult) || Array.isArray(assistantResult)) {\n throw new NonRetryableError(`Assistant step ${stepName} returned an invalid result object.`);\n }\n if (!(TOOL_JOURNAL_FIELD in assistantResult)) {\n return [];\n }\n const raw = assistantResult[TOOL_JOURNAL_FIELD];\n if (!Array.isArray(raw)) {\n throw new NonRetryableError(`Assistant step ${stepName} contains an invalid tool journal.`);\n }\n return raw.map((entry, index) => parsePersistedToolCall(entry, `${stepName}[${index}]`));\n};\n\nexport const hydrateReplayCache = (\n cache: PiToolReplayContext[\"cache\"],\n entries: PiPersistedToolCall[],\n): void => {\n const sorted = [...entries].sort(compareToolJournalEntries);\n for (const entry of sorted) {\n if (entry.source === \"replay\" && cache.has(entry.key)) {\n continue;\n }\n cache.set(entry.key, clonePersistedToolCall(entry));\n }\n};\n\n// --- Side-effect reducers ---\n\nconst reduceBashSideEffects = (state: unknown, entry: PiPersistedToolCall): unknown => {\n const details = isRecord(entry.result.details)\n ? (entry.result.details as {\n cwd?: unknown;\n files?: unknown;\n writes?: unknown;\n deletes?: unknown;\n deletedPaths?: unknown;\n })\n : {};\n const base = isRecord(state) ? (state as { cwd?: unknown; files?: unknown }) : {};\n\n const next = {\n cwd:\n typeof details.cwd === \"string\" ? details.cwd : typeof base.cwd === \"string\" ? base.cwd : \"/\",\n files:\n isRecord(base.files) && !Array.isArray(base.files)\n ? ({ ...(base.files as Record<string, unknown>) } as Record<string, unknown>)\n : ({} as Record<string, unknown>),\n };\n\n const detailsFiles =\n isRecord(details.files) && !Array.isArray(details.files) ? details.files : null;\n if (detailsFiles) {\n for (const [path, value] of Object.entries(detailsFiles)) {\n next.files[path] = value;\n }\n }\n\n if (Array.isArray(details.writes)) {\n for (const item of details.writes) {\n if (!isRecord(item)) {\n continue;\n }\n const writeEntry = item as { path?: unknown; content?: unknown };\n const path = typeof writeEntry.path === \"string\" ? writeEntry.path : null;\n if (!path) {\n continue;\n }\n next.files[path] = typeof writeEntry.content === \"string\" ? writeEntry.content : \"\";\n }\n }\n\n const deletes = Array.isArray(details.deletes)\n ? details.deletes\n : Array.isArray(details.deletedPaths)\n ? details.deletedPaths\n : [];\n for (const path of deletes) {\n if (typeof path === \"string\") {\n delete next.files[path];\n }\n }\n\n return next;\n};\n\nconst buildSideEffectState = (options: {\n cache: PiToolReplayContext[\"cache\"];\n reducers?: PiToolSideEffectReducerRegistry;\n}): Record<string, unknown> => {\n const reducers: PiToolSideEffectReducerRegistry = {\n bash: reduceBashSideEffects,\n ...options.reducers,\n };\n\n const state: Record<string, unknown> = {};\n const journal = [...options.cache.values()].sort(compareToolJournalEntries);\n\n for (const entry of journal) {\n const reducer = reducers[entry.toolName];\n if (!reducer) {\n continue;\n }\n\n try {\n state[entry.toolName] = reducer(state[entry.toolName], entry, {\n key: entry.key,\n sessionId: entry.sessionId,\n turnId: entry.turnId,\n });\n } catch (error) {\n throw new NonRetryableError(\n `Tool side-effect reducer failed for ${entry.toolName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return state;\n};\n\n// --- Replay context ---\n\nconst replaySequenceByContext = new WeakMap<PiToolReplayContext, number>();\n\nexport const takeNextReplaySequence = (replayContext: PiToolReplayContext): number => {\n const current = replaySequenceByContext.get(replayContext) ?? 0;\n replaySequenceByContext.set(replayContext, current + 1);\n return current;\n};\n\nexport const createReplayContext = (options: {\n cache: PiToolReplayContext[\"cache\"];\n reducers?: PiToolSideEffectReducerRegistry;\n}): PiToolReplayContext => {\n const localCache: PiToolReplayContext[\"cache\"] = new Map();\n for (const [key, entry] of options.cache.entries()) {\n localCache.set(key, clonePersistedToolCall(entry));\n }\n\n const replayContext: PiToolReplayContext = {\n cache: localCache,\n journal: [],\n sideEffects: buildSideEffectState({ cache: localCache, reducers: options.reducers }),\n };\n const maxSeq = [...localCache.values()].reduce(\n (max, entry) => (entry.seq > max ? entry.seq : max),\n -1,\n );\n replaySequenceByContext.set(replayContext, maxSeq + 1);\n return replayContext;\n};\n","import { NonRetryableError } from \"@fragno-dev/workflows\";\n\nimport {\n Agent,\n type AgentEvent,\n type AgentMessage,\n type AgentState,\n type AgentTool,\n} from \"@mariozechner/pi-agent-core\";\nimport type { AssistantMessage } from \"@mariozechner/pi-ai\";\n\nimport { PiLogger } from \"../../debug-log\";\nimport type {\n PiAgentDefinition,\n PiPersistedToolCall,\n PiPersistedToolResult,\n PiSession,\n PiToolFactory,\n PiToolFactoryContext,\n PiToolReplayContext,\n PiToolRegistry,\n} from \"../types\";\nimport {\n buildStableToolCallKey,\n buildToolErrorResult,\n clonePersistedToolCall,\n createPersistedToolCall,\n extractToolErrorMessage,\n takeNextReplaySequence,\n} from \"./tool-journal\";\n\nexport type AgentLoopParams = {\n sessionId: string;\n agentName: string;\n systemPrompt?: string;\n initialMessages?: AgentMessage[];\n};\n\n// --- Stream wrapping ---\n\ntype AgentStreamFn = NonNullable<PiAgentDefinition[\"streamFn\"]>;\ntype AgentStreamFnArgs = Parameters<AgentStreamFn>;\n\nconst isAssistantLikeMessage = (value: unknown): value is AssistantMessage =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { role?: unknown }).role === \"assistant\" &&\n Array.isArray((value as { content?: unknown }).content) &&\n typeof (value as { stopReason?: unknown }).stopReason === \"string\";\n\nconst buildStreamErrorAssistantMessage = (\n model: AgentStreamFnArgs[0],\n error: unknown,\n): AssistantMessage => ({\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"error\",\n errorMessage: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n});\n\nconst wrapStreamFn = (streamFn: PiAgentDefinition[\"streamFn\"]) =>\n streamFn\n ? async (...args: AgentStreamFnArgs) => {\n const [model] = args;\n const stream = await streamFn(...args);\n if (typeof stream !== \"object\" || stream === null || Array.isArray(stream)) {\n return stream;\n }\n\n const response = stream as { result?: unknown };\n if (typeof response.result !== \"function\") {\n return stream;\n }\n\n const originalResult = response.result.bind(stream) as () => Promise<unknown>;\n let streamResultError: unknown | undefined;\n response.result = async () => {\n if (streamResultError) {\n throw streamResultError;\n }\n\n try {\n const result = await originalResult();\n if (isAssistantLikeMessage(result)) {\n return result;\n }\n\n streamResultError = new Error(\"Stream result is not a valid assistant message.\");\n } catch (error) {\n streamResultError = error;\n }\n\n const errorMessage = buildStreamErrorAssistantMessage(model, streamResultError);\n if (\"push\" in stream && typeof stream.push === \"function\") {\n stream.push({ type: \"error\", reason: \"error\", error: errorMessage });\n }\n return errorMessage;\n };\n\n return stream;\n }\n : undefined;\n\n// --- Tool resolution ---\n\nconst resolveTool = async (\n name: string,\n factory: PiToolFactory | undefined,\n context: PiToolFactoryContext,\n): Promise<AgentTool> => {\n if (!factory) {\n throw new NonRetryableError(`Tool ${name} not found.`);\n }\n if (typeof factory === \"function\") {\n const tool = await factory(context);\n if (!tool) {\n throw new NonRetryableError(`Tool ${name} returned no definition.`);\n }\n return tool;\n }\n return factory;\n};\n\nconst wrapToolWithReplay = (options: {\n toolName: string;\n tool: AgentTool;\n context: PiToolFactoryContext;\n}): AgentTool => ({\n ...options.tool,\n execute: async (toolCallId, params, signal, onUpdate) => {\n const sessionId = options.context.session.id;\n const toolCallIdValue = String(toolCallId);\n const key = buildStableToolCallKey(sessionId, options.context.turnId, toolCallIdValue);\n const replayEntry = options.context.replay.cache.get(key);\n\n if (replayEntry) {\n options.context.replay.journal.push(\n clonePersistedToolCall({\n ...replayEntry,\n source: \"replay\",\n seq: takeNextReplaySequence(options.context.replay),\n }),\n );\n PiLogger.debug(\"tool replay hit\", {\n sessionId,\n turnId: options.context.turnId,\n toolName: replayEntry.toolName,\n key,\n });\n if (replayEntry.isError) {\n throw new Error(extractToolErrorMessage(replayEntry.result));\n }\n return structuredClone(replayEntry.result);\n }\n\n const argsSnapshot = structuredClone(params) as Record<string, unknown>;\n const recordResult = (result: PiPersistedToolResult, isError: boolean) => {\n const entry = createPersistedToolCall({\n sessionId,\n turnId: options.context.turnId,\n toolCallId: toolCallIdValue,\n toolName: options.toolName,\n args: argsSnapshot,\n result,\n isError,\n source: \"executed\",\n seq: takeNextReplaySequence(options.context.replay),\n });\n options.context.replay.cache.set(entry.key, clonePersistedToolCall(entry));\n options.context.replay.journal.push(clonePersistedToolCall(entry));\n return entry;\n };\n\n try {\n const result = await options.tool.execute(toolCallId, params, signal, onUpdate);\n recordResult(structuredClone(result) as PiPersistedToolResult, false);\n return result;\n } catch (error) {\n recordResult(buildToolErrorResult(error), true);\n throw error;\n }\n },\n});\n\nconst resolveTools = async (options: {\n agent: PiAgentDefinition;\n tools: PiToolRegistry;\n session: PiSession;\n turnId: string;\n messages: AgentMessage[];\n replay: PiToolReplayContext;\n}): Promise<AgentTool[]> => {\n const toolNames = options.agent.tools ?? [];\n if (toolNames.length === 0) {\n return [];\n }\n\n const context: PiToolFactoryContext = {\n session: options.session,\n turnId: options.turnId,\n toolConfig: options.agent.toolConfig ?? null,\n messages: options.messages,\n replay: options.replay,\n };\n\n const resolved: AgentTool[] = [];\n for (const name of toolNames) {\n const tool = await resolveTool(name, options.tools[name], context);\n resolved.push(wrapToolWithReplay({ toolName: name, tool, context }));\n }\n\n return resolved;\n};\n\n// --- Agent lifecycle ---\n\nconst findLastAssistantMessage = (messages: AgentMessage[]): AgentMessage | null =>\n messages.findLast((m) => m.role === \"assistant\") ?? null;\n\nconst createAgent = async (options: {\n agent: PiAgentDefinition;\n tools: PiToolRegistry;\n params: AgentLoopParams;\n messages: AgentMessage[];\n steeringMode: \"all\" | \"one-at-a-time\";\n turnId: string;\n replay: PiToolReplayContext;\n onEvent?: (event: AgentEvent) => void;\n}): Promise<{\n agent: Agent;\n trace: AgentEvent[];\n assistant: AgentMessage | null;\n toolJournal: PiPersistedToolCall[];\n}> => {\n const now = new Date();\n const session: PiSession = {\n id: options.params.sessionId,\n name: null,\n status: \"active\",\n agent: options.params.agentName,\n steeringMode: options.steeringMode,\n metadata: null,\n tags: [],\n createdAt: now,\n updatedAt: now,\n };\n\n const agentTools = await resolveTools({\n agent: options.agent,\n tools: options.tools,\n session,\n turnId: options.turnId,\n messages: options.messages,\n replay: options.replay,\n });\n\n const initialState: Partial<AgentState> = {\n systemPrompt: options.params.systemPrompt ?? options.agent.systemPrompt,\n model: options.agent.model,\n tools: agentTools,\n messages: options.messages,\n };\n\n if (options.agent.thinkingLevel) {\n initialState.thinkingLevel = options.agent.thinkingLevel;\n }\n\n const agent = new Agent({\n initialState,\n streamFn: wrapStreamFn(options.agent.streamFn),\n convertToLlm: options.agent.convertToLlm,\n transformContext: options.agent.transformContext,\n getApiKey: options.agent.getApiKey,\n thinkingBudgets: options.agent.thinkingBudgets,\n maxRetryDelayMs: options.agent.maxRetryDelayMs,\n sessionId: options.params.sessionId,\n });\n\n agent.setSteeringMode(options.steeringMode);\n\n const trace: AgentEvent[] = [];\n const unsubscribe = agent.subscribe((event) => {\n trace.push(event);\n options.onEvent?.(event);\n if (!options.agent.onEvent) {\n return;\n }\n try {\n options.agent.onEvent(event, { sessionId: options.params.sessionId, turnId: options.turnId });\n } catch (error) {\n console.warn(\"Agent onEvent hook failed.\", {\n error,\n sessionId: options.params.sessionId,\n turnId: options.turnId,\n agent: options.agent.name,\n });\n }\n });\n\n try {\n await agent.continue();\n } finally {\n unsubscribe();\n }\n\n const assistant = findLastAssistantMessage(agent.state.messages);\n const stateError = agent.state.error as unknown;\n if (stateError) {\n throw stateError instanceof Error ? stateError : new Error(String(stateError));\n }\n if (assistant && \"errorMessage\" in assistant && typeof assistant.errorMessage === \"string\") {\n throw new Error(assistant.errorMessage);\n }\n return {\n agent,\n trace,\n assistant,\n toolJournal: options.replay.journal.map(clonePersistedToolCall),\n };\n};\n\nexport const runAgentTurn = async (options: {\n params: AgentLoopParams;\n agent: PiAgentDefinition;\n tools: PiToolRegistry;\n messages: AgentMessage[];\n steeringMode: \"all\" | \"one-at-a-time\";\n turnId: string;\n replay: PiToolReplayContext;\n onEvent?: (event: AgentEvent) => void;\n}) => {\n const result = await createAgent(options);\n\n return {\n messages: result.agent.state.messages,\n trace: result.trace,\n assistant: result.assistant,\n toolJournal: result.toolJournal,\n };\n};\n","import { z } from \"zod\";\n\nimport type { HandlerTxContext, HooksMap } from \"@fragno-dev/db\";\nimport {\n defineWorkflow,\n NonRetryableError,\n type WorkflowEvent,\n type WorkflowStep,\n type WorkflowStepTx,\n type WorkflowsRegistry,\n} from \"@fragno-dev/workflows\";\n\nimport type { AgentEvent, AgentMessage } from \"@mariozechner/pi-agent-core\";\n\nimport { PiLogger } from \"../../debug-log\";\nimport { piSchema } from \"../../schema\";\nimport type { PiSessionStatus } from \"../constants\";\nimport { extractAssistantTextFromMessage, normalizeSteeringMode } from \"../mappers\";\nimport type {\n PiActiveSessionState,\n PiAgentLoopPhase,\n PiAgentLoopState,\n PiAgentLoopWaitingFor,\n PiAgentRegistry,\n PiFragmentConfig,\n PiSessionDetailEvent,\n PiToolReplayContext,\n PiToolRegistry,\n PiToolSideEffectReducerRegistry,\n PiTurnSummary,\n} from \"../types\";\nimport {\n createPiActiveSessionState,\n createInitialPiAgentLoopState,\n ensurePiActiveSessionState,\n} from \"./active-session\";\nimport { runAgentTurn, type AgentLoopParams } from \"./agent-runner\";\nimport { createReplayContext, hydrateReplayCache, parsePersistedToolJournal } from \"./tool-journal\";\n\nexport { createInitialPiAgentLoopState, ensurePiActiveSessionState };\n\nexport const PI_WORKFLOW_NAME = \"agent-loop-workflow\";\n\ntype WorkflowsOptions = {\n agents: PiAgentRegistry;\n tools: PiToolRegistry;\n toolSideEffectReducers?: PiToolSideEffectReducerRegistry;\n logging?: PiFragmentConfig[\"logging\"];\n};\n\nconst WAIT_FOR_USER_TIMEOUT = \"1 hour\" as const;\nconst WAIT_FOR_USER_TIMEOUT_MS = 60 * 60 * 1000;\n\nconst agentLoopParamsSchema: z.ZodType<AgentLoopParams> = z.object({\n sessionId: z.string(),\n agentName: z.string(),\n systemPrompt: z.string().optional(),\n initialMessages: z.array(z.custom<AgentMessage>()).optional(),\n});\n\nconst userMessageSchema = z.object({\n text: z.string().optional(),\n done: z.boolean().optional(),\n steeringMode: z.enum([\"all\", \"one-at-a-time\"]).optional(),\n});\n\n// --- Loop state ---\n\ntype LoopState = {\n messages: AgentMessage[];\n events: PiSessionDetailEvent[];\n trace: AgentEvent[];\n summaries: PiTurnSummary[];\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n replayCache: PiToolReplayContext[\"cache\"];\n activeSession: PiActiveSessionState;\n};\n\nconst buildWaitingForUser = (turn: number): NonNullable<PiAgentLoopWaitingFor> => ({\n type: \"user_message\",\n turn,\n stepKey: `waitForEvent:wait-user-${turn}`,\n timeoutMs: WAIT_FOR_USER_TIMEOUT_MS,\n});\n\nconst initLoopState = (\n params: AgentLoopParams,\n existingState: PiAgentLoopState | undefined,\n): LoopState => {\n const activeSession = existingState\n ? ensurePiActiveSessionState(existingState)\n : createPiActiveSessionState();\n\n return {\n messages: Array.isArray(params.initialMessages) ? params.initialMessages : [],\n events: [],\n trace: [],\n summaries: [],\n turn: 0,\n phase: \"waiting-for-user\",\n waitingFor: buildWaitingForUser(0),\n replayCache: new Map(),\n activeSession,\n };\n};\n\nconst setPhase = (loop: LoopState, phase: PiAgentLoopPhase) => {\n loop.phase = phase;\n switch (phase) {\n case \"waiting-for-user\":\n loop.waitingFor = buildWaitingForUser(loop.turn);\n break;\n case \"running-agent\":\n loop.waitingFor = {\n type: \"assistant\",\n turn: loop.turn,\n stepKey: `do:assistant-${loop.turn}`,\n };\n break;\n case \"complete\":\n loop.waitingFor = null;\n break;\n }\n};\n\ntype WorkflowContext =\n | { getState(): PiAgentLoopState; setState(state: Partial<PiAgentLoopState>): void }\n | undefined;\n\nconst emitState = (ctx: WorkflowContext, loop: LoopState) => {\n ctx?.setState({\n messages: loop.messages,\n events: loop.events,\n trace: loop.trace,\n summaries: loop.summaries,\n turn: loop.turn,\n phase: loop.phase,\n waitingFor: loop.waitingFor,\n activeSession: loop.activeSession,\n activeSessionUpdatesByTurn: loop.activeSession.exportReplayBuffer(),\n });\n};\n\n// --- DB status projection ---\n\nconst mutateSessionStatus = (\n forSchema: HandlerTxContext<HooksMap>[\"forSchema\"],\n sessionId: string,\n status: PiSessionStatus,\n): void => {\n try {\n const uow = forSchema(piSchema);\n uow.update(\"session\", sessionId, (builder) => builder.set({ status }));\n } catch {\n // Some workflow-only tests run without the pi fragment schema mounted. Status projection is a\n // best-effort integration concern, so those environments can safely skip this mutation.\n }\n};\n\nconst projectSessionStatus = (\n tx: WorkflowStepTx,\n sessionId: string,\n status: PiSessionStatus,\n): void => {\n tx.mutate(({ forSchema }) => {\n mutateSessionStatus(forSchema, sessionId, status);\n });\n};\n\n// --- Turn helpers ---\n\nconst buildDetailEvent = (\n turn: number,\n event: { type: string; payload: unknown; timestamp: Date | string | number },\n): PiSessionDetailEvent => {\n const timestamp = event.timestamp instanceof Date ? event.timestamp : new Date(event.timestamp);\n return {\n id: `${event.type}:${turn}:${timestamp.getTime()}`,\n type: event.type,\n payload: event.payload ?? null,\n createdAt: timestamp,\n deliveredAt: timestamp,\n consumedByStepKey: `waitForEvent:wait-user-${turn}`,\n };\n};\n\nconst buildTurnSummary = (turn: number, assistant: AgentMessage | null): PiTurnSummary | null => {\n if (!assistant) {\n return null;\n }\n return {\n turn,\n assistant,\n summary: extractAssistantTextFromMessage(assistant) || null,\n };\n};\n\nconst parseAssistantStepResult = (value: unknown, stepName: string) => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new NonRetryableError(`Assistant step ${stepName} returned an invalid result.`);\n }\n const result = value as { messages?: unknown; trace?: unknown; assistant?: unknown };\n if (!Array.isArray(result.messages)) {\n throw new NonRetryableError(`Assistant step ${stepName} is missing messages.`);\n }\n const messages = result.messages as AgentMessage[];\n const trace = Array.isArray(result.trace) ? (result.trace as AgentEvent[]) : [];\n const assistant =\n (result.assistant && typeof result.assistant === \"object\"\n ? (result.assistant as AgentMessage)\n : null) ??\n messages.findLast((m) => m.role === \"assistant\") ??\n null;\n\n return {\n messages,\n trace,\n assistant,\n toolJournal: parsePersistedToolJournal(value, stepName),\n };\n};\n\n// --- Workflow definition ---\n\nconst createPiAgentLoopWorkflow = (options: WorkflowsOptions) =>\n defineWorkflow(\n {\n name: PI_WORKFLOW_NAME,\n schema: agentLoopParamsSchema,\n initialState: createInitialPiAgentLoopState(),\n },\n async function (event: WorkflowEvent<AgentLoopParams>, step: WorkflowStep) {\n const params = agentLoopParamsSchema.parse(event.payload ?? {});\n const agentDefinition = options.agents[params.agentName];\n if (!agentDefinition) {\n throw new NonRetryableError(`Agent ${params.agentName} not found.`);\n }\n\n const loop = initLoopState(params, this?.getState());\n emitState(this, loop);\n\n while (true) {\n setPhase(loop, \"waiting-for-user\");\n emitState(this, loop);\n\n // Wait for the user to send a message (or signal done).\n const userEvent = await step.waitForEvent(`wait-user-${loop.turn}`, {\n type: \"user_message\",\n timeout: WAIT_FOR_USER_TIMEOUT,\n });\n const userPayload = userMessageSchema.parse(userEvent.payload ?? {});\n const userText = userPayload.text ?? \"\";\n const isDone = userPayload.done ?? false;\n const steeringMode = normalizeSteeringMode(userPayload.steeringMode);\n\n // Persist the user message as a durable step.\n loop.events = [...loop.events, buildDetailEvent(loop.turn, userEvent)];\n const userResult = await step.do(`user-${loop.turn}`, async (tx) => {\n projectSessionStatus(tx, event.instanceId, \"active\");\n const userMessage: AgentMessage = {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n timestamp: Date.now(),\n };\n return { messages: [...loop.messages, userMessage] };\n });\n loop.messages = userResult.messages;\n\n setPhase(loop, \"running-agent\");\n emitState(this, loop);\n\n // Run the AI agent turn as a retryable durable step.\n const replay = createReplayContext({\n cache: loop.replayCache,\n reducers: options.toolSideEffectReducers,\n });\n const assistantStepName = `assistant-${loop.turn}`;\n const traceLengthBeforeTurn = loop.trace.length;\n const turnId = `${event.instanceId}:${loop.turn}`;\n\n let assistantResult: Awaited<ReturnType<typeof runAgentTurn>>;\n try {\n assistantResult = await step.do(\n assistantStepName,\n { retries: { limit: 1, delay: \"0 ms\", backoff: \"constant\" } },\n async (tx) => {\n tx.onTerminalError.mutate(({ forSchema }) => {\n mutateSessionStatus(forSchema, event.instanceId, \"errored\");\n });\n\n const result = await runAgentTurn({\n params,\n agent: agentDefinition,\n tools: options.tools,\n messages: loop.messages,\n steeringMode,\n turnId,\n replay,\n onEvent: (agentEvent) => {\n loop.trace = [...loop.trace, agentEvent];\n loop.activeSession.publishEvent(loop.turn, agentEvent);\n emitState(this, loop);\n },\n });\n\n projectSessionStatus(tx, event.instanceId, isDone ? \"complete\" : \"waiting\");\n return result;\n },\n );\n } catch (error) {\n if (!(error instanceof Error && error.name === \"RunnerStepSuspended\")) {\n loop.activeSession.settleTurn(loop.turn, \"errored\");\n emitState(this, loop);\n }\n throw error;\n }\n\n const parsed = parseAssistantStepResult(assistantResult, assistantStepName);\n loop.messages = parsed.messages;\n loop.trace = [...loop.trace.slice(0, traceLengthBeforeTurn), ...parsed.trace];\n const summary = buildTurnSummary(loop.turn, parsed.assistant);\n if (summary) {\n loop.summaries = [...loop.summaries, summary];\n }\n hydrateReplayCache(loop.replayCache, parsed.toolJournal);\n\n if (isDone) {\n setPhase(loop, \"complete\");\n loop.activeSession.settleTurn(loop.turn, \"complete\");\n emitState(this, loop);\n return { messages: loop.messages };\n }\n\n loop.activeSession.settleTurn(loop.turn, \"waiting-for-user\");\n loop.turn += 1;\n emitState(this, loop);\n }\n },\n );\n\nexport type PiWorkflowsRegistry = {\n agentLoop: ReturnType<typeof createPiAgentLoopWorkflow>;\n};\n\nexport const createPiWorkflows = (options: WorkflowsOptions) => {\n PiLogger.reset();\n if (options.logging) {\n PiLogger.configure(options.logging);\n }\n\n return {\n agentLoop: createPiAgentLoopWorkflow(options),\n } satisfies WorkflowsRegistry;\n};\n","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","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":"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"}
|