@fragno-dev/pi-fragment 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE.md +16 -0
  2. package/README.md +107 -0
  3. package/bin/run.js +72 -0
  4. package/dist/browser/client/react.d.ts +264 -0
  5. package/dist/browser/client/react.d.ts.map +1 -0
  6. package/dist/browser/client/react.js +84 -0
  7. package/dist/browser/client/react.js.map +1 -0
  8. package/dist/browser/client/solid.d.ts +266 -0
  9. package/dist/browser/client/solid.d.ts.map +1 -0
  10. package/dist/browser/client/solid.js +122 -0
  11. package/dist/browser/client/solid.js.map +1 -0
  12. package/dist/browser/client/svelte.d.ts +261 -0
  13. package/dist/browser/client/svelte.d.ts.map +1 -0
  14. package/dist/browser/client/svelte.js +126 -0
  15. package/dist/browser/client/svelte.js.map +1 -0
  16. package/dist/browser/client/vanilla.d.ts +238 -0
  17. package/dist/browser/client/vanilla.d.ts.map +1 -0
  18. package/dist/browser/client/vanilla.js +11 -0
  19. package/dist/browser/client/vanilla.js.map +1 -0
  20. package/dist/browser/client/vue.d.ts +264 -0
  21. package/dist/browser/client/vue.d.ts.map +1 -0
  22. package/dist/browser/client/vue.js +125 -0
  23. package/dist/browser/client/vue.js.map +1 -0
  24. package/dist/browser/client-Bk-J98pf.d.ts +679 -0
  25. package/dist/browser/client-Bk-J98pf.d.ts.map +1 -0
  26. package/dist/browser/factory-DKoO_lRA.js +2470 -0
  27. package/dist/browser/factory-DKoO_lRA.js.map +1 -0
  28. package/dist/browser/index.d.ts +776 -0
  29. package/dist/browser/index.d.ts.map +1 -0
  30. package/dist/browser/index.js +3 -0
  31. package/dist/cli/cli.d.ts +1 -0
  32. package/dist/cli/cli.js +10 -0
  33. package/dist/cli/cli.js.map +1 -0
  34. package/dist/cli/config.d.ts +13 -0
  35. package/dist/cli/config.d.ts.map +1 -0
  36. package/dist/cli/config.js +64 -0
  37. package/dist/cli/config.js.map +1 -0
  38. package/dist/cli/http/client.js +95 -0
  39. package/dist/cli/http/client.js.map +1 -0
  40. package/dist/cli/mod.d.ts +62 -0
  41. package/dist/cli/mod.d.ts.map +1 -0
  42. package/dist/cli/mod.js +644 -0
  43. package/dist/cli/mod.js.map +1 -0
  44. package/dist/cli/render/index.d.ts +23 -0
  45. package/dist/cli/render/index.d.ts.map +1 -0
  46. package/dist/cli/render/index.js +37 -0
  47. package/dist/cli/render/index.js.map +1 -0
  48. package/dist/node/index.d.ts +10 -0
  49. package/dist/node/index.js +9 -0
  50. package/dist/node/pi/clients.d.ts +240 -0
  51. package/dist/node/pi/clients.d.ts.map +1 -0
  52. package/dist/node/pi/clients.js +18 -0
  53. package/dist/node/pi/clients.js.map +1 -0
  54. package/dist/node/pi/constants.d.ts +9 -0
  55. package/dist/node/pi/constants.d.ts.map +1 -0
  56. package/dist/node/pi/constants.js +22 -0
  57. package/dist/node/pi/constants.js.map +1 -0
  58. package/dist/node/pi/definition.d.ts +13 -0
  59. package/dist/node/pi/definition.d.ts.map +1 -0
  60. package/dist/node/pi/definition.js +10 -0
  61. package/dist/node/pi/definition.js.map +1 -0
  62. package/dist/node/pi/dsl.d.ts +24 -0
  63. package/dist/node/pi/dsl.d.ts.map +1 -0
  64. package/dist/node/pi/dsl.js +57 -0
  65. package/dist/node/pi/dsl.js.map +1 -0
  66. package/dist/node/pi/factory.d.ts +220 -0
  67. package/dist/node/pi/factory.d.ts.map +1 -0
  68. package/dist/node/pi/factory.js +12 -0
  69. package/dist/node/pi/factory.js.map +1 -0
  70. package/dist/node/pi/mappers.js +47 -0
  71. package/dist/node/pi/mappers.js.map +1 -0
  72. package/dist/node/pi/route-schemas.js +112 -0
  73. package/dist/node/pi/route-schemas.js.map +1 -0
  74. package/dist/node/pi/types.d.ts +67 -0
  75. package/dist/node/pi/types.d.ts.map +1 -0
  76. package/dist/node/pi/workflow.d.ts +31 -0
  77. package/dist/node/pi/workflow.d.ts.map +1 -0
  78. package/dist/node/pi/workflow.js +242 -0
  79. package/dist/node/pi/workflow.js.map +1 -0
  80. package/dist/node/routes.d.ts +217 -0
  81. package/dist/node/routes.d.ts.map +1 -0
  82. package/dist/node/routes.js +328 -0
  83. package/dist/node/routes.js.map +1 -0
  84. package/dist/node/schema.js +12 -0
  85. package/dist/node/schema.js.map +1 -0
  86. package/dist/tsconfig.tsbuildinfo +1 -0
  87. package/package.json +125 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","names":[],"sources":["../../src/cli/mod.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\n\nimport { resolveConfig, type ResolvedCliConfig } from \"./config\";\nimport { createHttpClient } from \"./http/client\";\nimport { renderOutput, type RenderOutput } from \"./render\";\n\nexport type CliActionResult = {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n output?: RenderOutput;\n};\n\nexport type SessionsListArgs = {\n limit?: number;\n};\n\nexport type SessionsCreateArgs = {\n agent: string;\n name?: string;\n tags?: string[];\n metadata?: unknown;\n steeringMode?: \"all\" | \"one-at-a-time\";\n};\n\nexport type SessionsGetArgs = {\n sessionId: string;\n statusOnly?: boolean;\n};\n\nexport type SessionsSendMessageArgs = {\n sessionId: string;\n text?: string;\n file?: string;\n done?: boolean;\n steeringMode?: \"all\" | \"one-at-a-time\";\n};\n\nexport type CliContext = {\n config: ResolvedCliConfig;\n logger: Pick<Console, \"log\" | \"error\">;\n};\n\nexport type CliActions = {\n sessionsList: (\n args: SessionsListArgs,\n ctx: CliContext,\n ) => Promise<CliActionResult | void> | CliActionResult | void;\n sessionsCreate: (\n args: SessionsCreateArgs,\n ctx: CliContext,\n ) => Promise<CliActionResult | void> | CliActionResult | void;\n sessionsGet: (\n args: SessionsGetArgs,\n ctx: CliContext,\n ) => Promise<CliActionResult | void> | CliActionResult | void;\n sessionsSendMessage: (\n args: SessionsSendMessageArgs,\n ctx: CliContext,\n ) => Promise<CliActionResult | void> | CliActionResult | void;\n};\n\nexport type RunOptions = {\n logger?: Pick<Console, \"log\" | \"error\">;\n actions?: CliActions;\n};\n\nconst USAGE = `fragno-pi <command> [options]\n\nCommands:\n sessions list List pi-fragment sessions\n sessions create Create a pi-fragment session\n sessions get Fetch session detail/status\n sessions send-message Send a user message to a session\n\nGlobal options:\n -b, --base-url <url> Fragment base URL (FRAGNO_PI_BASE_URL)\n -H, --header <header> Extra HTTP header (repeatable)\n --timeout <ms> Request timeout in ms (default: 15000)\n --retries <n> Retry count (default: 2)\n --retry-delay <ms> Delay between retries (default: 500)\n --json Output raw JSON\n --debug Log request metadata to stderr\n -h, --help Show this help message\n\nsessions list:\n --limit <n> Limit results (default server: 50)\n\nsessions create:\n --agent <name> Agent name (required)\n --name <label> Session label\n --tag <tag> Tag (repeatable)\n --metadata <json> Metadata JSON string\n --steering-mode <mode> all|one-at-a-time\n\nsessions get:\n -s, --session <id> Session id (or positional)\n --status-only Only output status fields\n\nsessions send-message:\n -s, --session <id> Session id (or positional)\n --text <message> Message text\n --file <path> Read message text from file\n --done Mark session done\n --steering-mode <mode> all|one-at-a-time`;\n\nconst buildErrorResult = (message: string, usage = USAGE): CliActionResult => ({\n stderr: `${message}\\n\\n${usage}`,\n exitCode: 1,\n});\n\nconst requireBaseUrl = (config: ResolvedCliConfig): CliActionResult | null => {\n if (config.baseUrl) {\n return null;\n }\n return buildErrorResult(\"Missing required option: --base-url (or FRAGNO_PI_BASE_URL)\");\n};\n\nconst debugLog = (\n config: ResolvedCliConfig,\n logger: Pick<Console, \"log\" | \"error\"> | undefined,\n message: string,\n) => {\n if (!config.debug) {\n return;\n }\n if (logger?.error) {\n logger.error(message);\n return;\n }\n console.error(message);\n};\n\nconst readResponseBody = async (response: Response): Promise<unknown> => {\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n};\n\nconst formatErrorMessage = (status: number, body: unknown): string => {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const message = (body as { message?: string }).message;\n if (message) {\n return `Request failed (${status}): ${message}`;\n }\n }\n if (typeof body === \"string\" && body.trim()) {\n return `Request failed (${status}): ${body}`;\n }\n return `Request failed (${status}).`;\n};\n\nconst buildClient = (config: ResolvedCliConfig) =>\n createHttpClient({\n baseUrl: config.baseUrl ?? \"\",\n headers: config.headers,\n timeoutMs: config.timeoutMs,\n retries: config.retries,\n retryDelayMs: config.retryDelayMs,\n });\n\nconst requestJson = async (\n config: ResolvedCliConfig,\n logger: Pick<Console, \"log\" | \"error\"> | undefined,\n options: { method: string; path: string; body?: unknown },\n): Promise<{ ok: true; data: unknown } | { ok: false; error: CliActionResult }> => {\n const baseError = requireBaseUrl(config);\n if (baseError) {\n return { ok: false, error: baseError };\n }\n\n const client = buildClient(config);\n debugLog(config, logger, `request ${options.method} ${options.path}`);\n\n try {\n const response = await client.request({\n method: options.method,\n path: options.path,\n body: options.body,\n });\n\n const body = await readResponseBody(response);\n debugLog(config, logger, `response ${response.status} ${options.method} ${options.path}`);\n\n if (!response.ok) {\n return {\n ok: false,\n error: { stderr: formatErrorMessage(response.status, body), exitCode: 2 },\n };\n }\n\n return { ok: true, data: body };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, error: { stderr: message, exitCode: 2 } };\n }\n};\n\nconst getRecordValue = (record: Record<string, unknown>, key: string): string => {\n const value = record[key];\n return value === null || value === undefined ? \"\" : String(value);\n};\n\nconst buildSessionsListOutput = (data: unknown, json: boolean): CliActionResult => {\n if (!Array.isArray(data)) {\n return { stderr: \"Unexpected response for sessions list.\", exitCode: 2 };\n }\n\n if (json) {\n return { output: { format: \"json\", data } };\n }\n\n const rows = data.map((session) => {\n if (session && typeof session === \"object\") {\n const record = session as Record<string, unknown>;\n return {\n id: getRecordValue(record, \"id\"),\n agent: getRecordValue(record, \"agent\"),\n name: getRecordValue(record, \"name\"),\n status: getRecordValue(record, \"status\"),\n updated: getRecordValue(record, \"updatedAt\"),\n };\n }\n return { id: \"\", agent: \"\", name: \"\", status: \"\", updated: \"\" };\n });\n\n return {\n output: {\n format: \"table\",\n columns: [\n { key: \"id\", label: \"ID\" },\n { key: \"agent\", label: \"Agent\" },\n { key: \"name\", label: \"Name\" },\n { key: \"status\", label: \"Status\" },\n { key: \"updated\", label: \"Updated\" },\n ],\n rows,\n },\n };\n};\n\nconst buildDetailOutput = (data: unknown, json: boolean): CliActionResult => {\n if (json) {\n return { output: { format: \"json\", data } };\n }\n return { output: { format: \"pretty-json\", data } };\n};\n\nconst buildSendMessageOutput = (data: unknown, json: boolean): CliActionResult => {\n if (json) {\n return { output: { format: \"json\", data } };\n }\n\n if (!data || typeof data !== \"object\") {\n return { output: { format: \"pretty-json\", data } };\n }\n\n const record = data as Record<string, unknown>;\n const status = record[\"status\"];\n const assistant = record[\"assistant\"];\n const hasAssistant = assistant !== undefined && assistant !== null;\n\n const lines: string[] = [];\n if (status !== undefined) {\n lines.push(`Status: ${String(status)}`);\n }\n if (hasAssistant) {\n const assistantText =\n typeof assistant === \"string\" ? assistant : JSON.stringify(assistant, null, 2);\n lines.push(assistantText);\n } else if (status !== undefined) {\n lines.push(\"Message accepted. Use `sessions get` to fetch the response.\");\n }\n\n if (lines.length === 0) {\n return { output: { format: \"pretty-json\", data } };\n }\n\n return { output: { format: \"text\", text: lines.join(\"\\n\\n\") } };\n};\n\nconst resolveMessageText = async (\n args: SessionsSendMessageArgs,\n): Promise<{ ok: true; text: string } | { ok: false; error: CliActionResult }> => {\n if (args.text) {\n return { ok: true, text: args.text };\n }\n if (!args.file) {\n return {\n ok: false,\n error: buildErrorResult(\"Missing required option: --text (or --file)\"),\n };\n }\n try {\n const text = await readFile(args.file, \"utf8\");\n return { ok: true, text };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n ok: false,\n error: buildErrorResult(`Unable to read --file ${args.file}: ${message}`),\n };\n }\n};\n\nconst defaultActions: CliActions = {\n sessionsList: async (args, ctx) => {\n const query = new URLSearchParams();\n if (args.limit !== undefined) {\n query.set(\"limit\", String(args.limit));\n }\n const path = query.size ? `/sessions?${query.toString()}` : \"/sessions\";\n const response = await requestJson(ctx.config, ctx.logger, { method: \"GET\", path });\n if (!response.ok) {\n return response.error;\n }\n return buildSessionsListOutput(response.data, ctx.config.json);\n },\n sessionsCreate: async (args, ctx) => {\n const body: Record<string, unknown> = { agent: args.agent };\n if (args.name) {\n body[\"name\"] = args.name;\n }\n if (args.tags && args.tags.length > 0) {\n body[\"tags\"] = args.tags;\n }\n if (args.metadata !== undefined) {\n body[\"metadata\"] = args.metadata;\n }\n if (args.steeringMode) {\n body[\"steeringMode\"] = args.steeringMode;\n }\n\n const response = await requestJson(ctx.config, ctx.logger, {\n method: \"POST\",\n path: \"/sessions\",\n body,\n });\n if (!response.ok) {\n return response.error;\n }\n return buildDetailOutput(response.data, ctx.config.json);\n },\n sessionsGet: async (args, ctx) => {\n const path = `/sessions/${encodeURIComponent(args.sessionId)}`;\n const response = await requestJson(ctx.config, ctx.logger, { method: \"GET\", path });\n if (!response.ok) {\n return response.error;\n }\n const data = response.data;\n const outputData =\n args.statusOnly && data && typeof data === \"object\"\n ? {\n status: (data as Record<string, unknown>)[\"status\"],\n workflow: (data as Record<string, unknown>)[\"workflow\"],\n summaries: (data as Record<string, unknown>)[\"summaries\"],\n }\n : data;\n return buildDetailOutput(outputData, ctx.config.json);\n },\n sessionsSendMessage: async (args, ctx) => {\n const resolved = await resolveMessageText(args);\n if (!resolved.ok) {\n return resolved.error;\n }\n const body: Record<string, unknown> = { text: resolved.text };\n if (args.done) {\n body[\"done\"] = true;\n }\n if (args.steeringMode) {\n body[\"steeringMode\"] = args.steeringMode;\n }\n const path = `/sessions/${encodeURIComponent(args.sessionId)}/messages`;\n const response = await requestJson(ctx.config, ctx.logger, { method: \"POST\", path, body });\n if (!response.ok) {\n return response.error;\n }\n return buildSendMessageOutput(response.data, ctx.config.json);\n },\n};\n\ntype ParsedArgs = {\n command?: string;\n action?: string;\n options: Record<string, string | boolean | string[]>;\n positionals: string[];\n help: boolean;\n errors: string[];\n};\n\nconst VALUE_OPTIONS = new Set([\n \"base-url\",\n \"header\",\n \"timeout\",\n \"retries\",\n \"retry-delay\",\n \"limit\",\n \"agent\",\n \"name\",\n \"tag\",\n \"metadata\",\n \"steering-mode\",\n \"session\",\n \"text\",\n \"file\",\n]);\n\nconst SHORT_OPTIONS: Record<string, string> = {\n \"-b\": \"base-url\",\n \"-H\": \"header\",\n \"-s\": \"session\",\n};\n\nconst ALL_LONG_OPTIONS = new Set([...VALUE_OPTIONS, \"json\", \"debug\", \"status-only\", \"done\"]);\n\nconst ALL_SHORT_OPTIONS = new Set(Object.keys(SHORT_OPTIONS));\n\nconst editDistance = (left: string, right: string): number => {\n const leftLen = left.length;\n const rightLen = right.length;\n const dp: number[] = Array.from({ length: rightLen + 1 }, (_, index) => index);\n\n for (let i = 1; i <= leftLen; i += 1) {\n let prev = dp[0] ?? 0;\n dp[0] = i;\n const leftChar = left[i - 1];\n for (let j = 1; j <= rightLen; j += 1) {\n const temp = dp[j] ?? 0;\n const cost = leftChar === right[j - 1] ? 0 : 1;\n dp[j] = Math.min((dp[j] ?? 0) + 1, (dp[j - 1] ?? 0) + 1, prev + cost);\n prev = temp;\n }\n }\n\n return dp[rightLen] ?? Math.max(leftLen, rightLen);\n};\n\nconst suggestLongOption = (key: string): string | null => {\n let best: { key: string; score: number } | null = null;\n for (const candidate of ALL_LONG_OPTIONS) {\n const score = editDistance(key, candidate);\n if (!best || score < best.score) {\n best = { key: candidate, score };\n }\n }\n if (best && best.score <= 3) {\n return best.key;\n }\n return null;\n};\n\nconst addOption = (\n options: Record<string, string | boolean | string[]>,\n key: string,\n value: string | boolean,\n) => {\n if (typeof value === \"boolean\") {\n options[key] = value;\n return;\n }\n\n const current = options[key];\n if (!current) {\n options[key] = value;\n return;\n }\n if (Array.isArray(current)) {\n current.push(value);\n return;\n }\n options[key] = [String(current), value];\n};\n\nconst coerceBooleanValue = (value: string): boolean | string => {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") {\n return false;\n }\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") {\n return true;\n }\n return value;\n};\n\nconst parseArgs = (argv: string[]): ParsedArgs => {\n const options: Record<string, string | boolean | string[]> = {};\n const positionals: string[] = [];\n const errors: string[] = [];\n let help = false;\n let i = 0;\n\n while (i < argv.length) {\n const arg = argv[i];\n if (arg === \"--\") {\n positionals.push(...argv.slice(i + 1));\n break;\n }\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n i += 1;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n const [rawKey, rawValue] = arg.split(\"=\", 2);\n const key = rawKey.slice(2);\n if (!ALL_LONG_OPTIONS.has(key)) {\n const suggestion = suggestLongOption(key);\n errors.push(\n `Unknown option: --${key}${suggestion ? ` (did you mean --${suggestion}?)` : \"\"}`,\n );\n if (rawValue !== undefined) {\n i += 1;\n continue;\n }\n const next = argv[i + 1];\n if (next && !next.startsWith(\"-\")) {\n i += 2;\n } else {\n i += 1;\n }\n continue;\n }\n if (rawValue !== undefined) {\n const normalizedValue = VALUE_OPTIONS.has(key) ? rawValue : coerceBooleanValue(rawValue);\n addOption(options, key, normalizedValue);\n i += 1;\n continue;\n }\n if (VALUE_OPTIONS.has(key)) {\n const next = argv[i + 1];\n if (!next || next.startsWith(\"-\")) {\n errors.push(`Missing value for --${key}`);\n i += 1;\n continue;\n }\n addOption(options, key, next);\n i += 2;\n continue;\n }\n addOption(options, key, true);\n i += 1;\n continue;\n }\n if (arg.startsWith(\"-\") && arg.length > 1) {\n if (arg === \"-h\") {\n help = true;\n i += 1;\n continue;\n }\n if (!ALL_SHORT_OPTIONS.has(arg)) {\n errors.push(`Unknown option: ${arg}`);\n i += 1;\n continue;\n }\n const key = SHORT_OPTIONS[arg];\n if (key) {\n const next = argv[i + 1];\n if (!next || next.startsWith(\"-\")) {\n errors.push(`Missing value for ${arg}`);\n i += 1;\n continue;\n }\n addOption(options, key, next);\n i += 2;\n continue;\n }\n positionals.push(arg);\n i += 1;\n continue;\n }\n positionals.push(arg);\n i += 1;\n }\n\n const [command, action, ...rest] = positionals;\n\n return { command, action, options, positionals: rest, help, errors };\n};\n\nconst getStringOption = (\n options: Record<string, string | boolean | string[]>,\n key: string,\n): string | undefined => {\n const value = options[key];\n if (Array.isArray(value)) {\n return value[0];\n }\n if (typeof value === \"string\") {\n return value;\n }\n return undefined;\n};\n\nconst getStringArrayOption = (\n options: Record<string, string | boolean | string[]>,\n key: string,\n): string[] | undefined => {\n const value = options[key];\n if (Array.isArray(value)) {\n return value.map(String);\n }\n if (typeof value === \"string\") {\n return [value];\n }\n return undefined;\n};\n\nconst getBooleanOption = (\n options: Record<string, string | boolean | string[]>,\n key: string,\n): boolean => Boolean(options[key]);\n\nconst parseNumberOption = (\n options: Record<string, string | boolean | string[]>,\n key: string,\n): number | undefined => {\n const value = getStringOption(options, key);\n if (!value) {\n return undefined;\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid value for --${key}`);\n }\n return parsed;\n};\n\nconst parseSteeringMode = (value?: string): \"all\" | \"one-at-a-time\" | undefined => {\n if (!value) {\n return undefined;\n }\n if (value === \"all\" || value === \"one-at-a-time\") {\n return value;\n }\n throw new Error(\"Invalid --steering-mode. Expected: all|one-at-a-time\");\n};\n\nconst resolveRunOptions = (\n loggerOrOptions?: Pick<Console, \"log\" | \"error\"> | RunOptions,\n): RunOptions => {\n if (!loggerOrOptions) {\n return {};\n }\n if (\"log\" in loggerOrOptions) {\n return { logger: loggerOrOptions };\n }\n return loggerOrOptions;\n};\n\nconst buildConfig = (options: Record<string, string | boolean | string[]>): ResolvedCliConfig => {\n return resolveConfig({\n baseUrl: getStringOption(options, \"base-url\"),\n headers: getStringArrayOption(options, \"header\"),\n timeoutMs: getStringOption(options, \"timeout\"),\n retries: getStringOption(options, \"retries\"),\n retryDelayMs: getStringOption(options, \"retry-delay\"),\n json: getBooleanOption(options, \"json\"),\n debug: getBooleanOption(options, \"debug\"),\n });\n};\n\nconst renderResult = (\n result: CliActionResult | void,\n config: ResolvedCliConfig,\n): CliActionResult => {\n if (!result) {\n return {};\n }\n if (!result.stdout && result.output) {\n return { ...result, stdout: renderOutput(result.output, config.json) };\n }\n return result;\n};\n\nexport async function run(\n argv: string[],\n loggerOrOptions: Pick<Console, \"log\" | \"error\"> | RunOptions = console,\n): Promise<number> {\n const options = resolveRunOptions(loggerOrOptions);\n const logger = options.logger ?? console;\n const actions = options.actions ?? defaultActions;\n\n const parsed = parseArgs(argv.slice(2));\n\n if (parsed.errors.length > 0) {\n const result = buildErrorResult(parsed.errors.join(\"\\n\"));\n logger.error(result.stderr ?? \"\");\n return result.exitCode ?? 1;\n }\n\n if (parsed.help || !parsed.command || parsed.command === \"help\") {\n logger.log(USAGE);\n return parsed.command && !parsed.help ? 1 : 0;\n }\n\n let config: ResolvedCliConfig;\n try {\n config = buildConfig(parsed.options);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const result = buildErrorResult(message);\n logger.error(result.stderr ?? \"\");\n return result.exitCode ?? 1;\n }\n\n const ctx: CliContext = { config, logger };\n const command = parsed.command;\n const action = parsed.action;\n const opts = parsed.options;\n\n try {\n let result: CliActionResult | void;\n switch (command) {\n case \"sessions\": {\n if (!action) {\n result = buildErrorResult(\"Missing sessions action.\");\n break;\n }\n switch (action) {\n case \"list\": {\n const limit = parseNumberOption(opts, \"limit\");\n result = await actions.sessionsList({ limit }, ctx);\n break;\n }\n case \"create\": {\n const agent = getStringOption(opts, \"agent\");\n if (!agent) {\n result = buildErrorResult(\"Missing required option: --agent\");\n break;\n }\n const steeringMode = parseSteeringMode(getStringOption(opts, \"steering-mode\"));\n const metadataRaw = getStringOption(opts, \"metadata\");\n let metadata: unknown;\n if (metadataRaw) {\n try {\n metadata = JSON.parse(metadataRaw);\n } catch {\n result = buildErrorResult(\"Invalid JSON for --metadata\");\n break;\n }\n }\n result = await actions.sessionsCreate(\n {\n agent,\n name: getStringOption(opts, \"name\"),\n tags: getStringArrayOption(opts, \"tag\"),\n metadata,\n steeringMode,\n },\n ctx,\n );\n break;\n }\n case \"get\": {\n const sessionId = getStringOption(opts, \"session\") ?? parsed.positionals[0];\n if (!sessionId) {\n result = buildErrorResult(\"Missing required option: --session\");\n break;\n }\n result = await actions.sessionsGet(\n { sessionId, statusOnly: getBooleanOption(opts, \"status-only\") },\n ctx,\n );\n break;\n }\n case \"send-message\": {\n const sessionId = getStringOption(opts, \"session\") ?? parsed.positionals[0];\n if (!sessionId) {\n result = buildErrorResult(\"Missing required option: --session\");\n break;\n }\n const steeringMode = parseSteeringMode(getStringOption(opts, \"steering-mode\"));\n const text = getStringOption(opts, \"text\");\n const file = getStringOption(opts, \"file\");\n if (!text && !file) {\n result = buildErrorResult(\"Missing required option: --text (or --file)\");\n break;\n }\n result = await actions.sessionsSendMessage(\n { sessionId, text, file, done: getBooleanOption(opts, \"done\"), steeringMode },\n ctx,\n );\n break;\n }\n default: {\n result = buildErrorResult(`Unknown sessions action: ${action}`);\n break;\n }\n }\n break;\n }\n default: {\n result = buildErrorResult(`Unknown command: ${command}`);\n break;\n }\n }\n\n const resolved = renderResult(result, config);\n if (resolved.stdout) {\n logger.log(resolved.stdout);\n }\n if (resolved.stderr) {\n logger.error(resolved.stderr);\n }\n if (typeof resolved.exitCode === \"number\") {\n return resolved.exitCode;\n }\n return resolved.stderr ? 1 : 0;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`${message}\\n\\n${USAGE}`);\n return 1;\n }\n}\n\nexport const __testing = { USAGE, parseArgs, renderOutput };\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ //#region src/cli/render/index.d.ts
2
+ type TableRow = Record<string, string | number | null | undefined>;
3
+ type TableColumn = {
4
+ key: string;
5
+ label: string;
6
+ };
7
+ type RenderOutput = {
8
+ format: "json";
9
+ data: unknown;
10
+ } | {
11
+ format: "pretty-json";
12
+ data: unknown;
13
+ } | {
14
+ format: "table";
15
+ columns: TableColumn[];
16
+ rows: TableRow[];
17
+ } | {
18
+ format: "text";
19
+ text: string;
20
+ };
21
+ //#endregion
22
+ export { RenderOutput };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/cli/render/index.ts"],"mappings":";KAAY,QAAA,GAAW,MAAA;AAAA,KAEX,WAAA;EACV,GAAA;EACA,KAAA;AAAA;AAAA,KAGU,YAAA;EACN,MAAA;EAAgB,IAAA;AAAA;EAChB,MAAA;EAAuB,IAAA;AAAA;EACvB,MAAA;EAAiB,OAAA,EAAS,WAAA;EAAe,IAAA,EAAM,QAAA;AAAA;EAC/C,MAAA;EAAgB,IAAA;AAAA"}
@@ -0,0 +1,37 @@
1
+ //#region src/cli/render/index.ts
2
+ const stringify = (data, pretty) => pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
3
+ const pad = (value, width) => value.padEnd(width, " ");
4
+ const buildTable = (columns, rows) => {
5
+ const widths = columns.map((column) => {
6
+ const headerWidth = column.label.length;
7
+ const contentWidth = rows.reduce((max, row) => {
8
+ const raw = row[column.key];
9
+ const value = raw === null || raw === void 0 ? "" : String(raw);
10
+ return Math.max(max, value.length);
11
+ }, 0);
12
+ return Math.max(headerWidth, contentWidth);
13
+ });
14
+ return [
15
+ columns.map((column, index) => pad(column.label, widths[index] ?? column.label.length)).join(" "),
16
+ columns.map((column, index) => pad("-".repeat(widths[index] ?? column.label.length), widths[index] ?? column.label.length)).join(" "),
17
+ ...rows.map((row) => columns.map((column, index) => {
18
+ const raw = row[column.key];
19
+ const value = raw === null || raw === void 0 ? "" : String(raw);
20
+ return pad(value, widths[index] ?? value.length);
21
+ }).join(" "))
22
+ ].join("\n");
23
+ };
24
+ const renderOutput = (output, json) => {
25
+ if (json) return stringify("data" in output ? output.data : null, false);
26
+ switch (output.format) {
27
+ case "json": return stringify(output.data, false);
28
+ case "pretty-json": return stringify(output.data, true);
29
+ case "table": return buildTable(output.columns, output.rows);
30
+ case "text": return output.text;
31
+ default: return "";
32
+ }
33
+ };
34
+
35
+ //#endregion
36
+ export { renderOutput };
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/render/index.ts"],"sourcesContent":["export type TableRow = Record<string, string | number | null | undefined>;\n\nexport type TableColumn = {\n key: string;\n label: string;\n};\n\nexport type RenderOutput =\n | { format: \"json\"; data: unknown }\n | { format: \"pretty-json\"; data: unknown }\n | { format: \"table\"; columns: TableColumn[]; rows: TableRow[] }\n | { format: \"text\"; text: string };\n\nconst stringify = (data: unknown, pretty: boolean): string =>\n pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\n\nconst pad = (value: string, width: number): string => value.padEnd(width, \" \");\n\nconst buildTable = (columns: TableColumn[], rows: TableRow[]): string => {\n const widths = columns.map((column) => {\n const headerWidth = column.label.length;\n const contentWidth = rows.reduce((max, row) => {\n const raw = row[column.key];\n const value = raw === null || raw === undefined ? \"\" : String(raw);\n return Math.max(max, value.length);\n }, 0);\n return Math.max(headerWidth, contentWidth);\n });\n\n const header = columns\n .map((column, index) => pad(column.label, widths[index] ?? column.label.length))\n .join(\" \");\n const divider = columns\n .map((column, index) =>\n pad(\"-\".repeat(widths[index] ?? column.label.length), widths[index] ?? column.label.length),\n )\n .join(\" \");\n const body = rows.map((row) =>\n columns\n .map((column, index) => {\n const raw = row[column.key];\n const value = raw === null || raw === undefined ? \"\" : String(raw);\n return pad(value, widths[index] ?? value.length);\n })\n .join(\" \"),\n );\n\n return [header, divider, ...body].join(\"\\n\");\n};\n\nexport const renderOutput = (output: RenderOutput, json: boolean): string => {\n if (json) {\n const data = \"data\" in output ? output.data : null;\n return stringify(data, false);\n }\n\n switch (output.format) {\n case \"json\":\n return stringify(output.data, false);\n case \"pretty-json\":\n return stringify(output.data, true);\n case \"table\":\n return buildTable(output.columns, output.rows);\n case \"text\":\n return output.text;\n default:\n return \"\";\n }\n};\n"],"mappings":";AAaA,MAAM,aAAa,MAAe,WAChC,SAAS,KAAK,UAAU,MAAM,MAAM,EAAE,GAAG,KAAK,UAAU,KAAK;AAE/D,MAAM,OAAO,OAAe,UAA0B,MAAM,OAAO,OAAO,IAAI;AAE9E,MAAM,cAAc,SAAwB,SAA6B;CACvE,MAAM,SAAS,QAAQ,KAAK,WAAW;EACrC,MAAM,cAAc,OAAO,MAAM;EACjC,MAAM,eAAe,KAAK,QAAQ,KAAK,QAAQ;GAC7C,MAAM,MAAM,IAAI,OAAO;GACvB,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,SAAY,KAAK,OAAO,IAAI;AAClE,UAAO,KAAK,IAAI,KAAK,MAAM,OAAO;KACjC,EAAE;AACL,SAAO,KAAK,IAAI,aAAa,aAAa;GAC1C;AAoBF,QAAO;EAlBQ,QACZ,KAAK,QAAQ,UAAU,IAAI,OAAO,OAAO,OAAO,UAAU,OAAO,MAAM,OAAO,CAAC,CAC/E,KAAK,KAAK;EACG,QACb,KAAK,QAAQ,UACZ,IAAI,IAAI,OAAO,OAAO,UAAU,OAAO,MAAM,OAAO,EAAE,OAAO,UAAU,OAAO,MAAM,OAAO,CAC5F,CACA,KAAK,KAAK;EAWY,GAVZ,KAAK,KAAK,QACrB,QACG,KAAK,QAAQ,UAAU;GACtB,MAAM,MAAM,IAAI,OAAO;GACvB,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,SAAY,KAAK,OAAO,IAAI;AAClE,UAAO,IAAI,OAAO,OAAO,UAAU,MAAM,OAAO;IAChD,CACD,KAAK,KAAK,CACd;EAEgC,CAAC,KAAK,KAAK;;AAG9C,MAAa,gBAAgB,QAAsB,SAA0B;AAC3E,KAAI,KAEF,QAAO,UADM,UAAU,SAAS,OAAO,OAAO,MACvB,MAAM;AAG/B,SAAQ,OAAO,QAAf;EACE,KAAK,OACH,QAAO,UAAU,OAAO,MAAM,MAAM;EACtC,KAAK,cACH,QAAO,UAAU,OAAO,MAAM,KAAK;EACrC,KAAK,QACH,QAAO,WAAW,OAAO,SAAS,OAAO,KAAK;EAChD,KAAK,OACH,QAAO,OAAO;EAChB,QACE,QAAO"}
@@ -0,0 +1,10 @@
1
+ import { createPiFragmentClients } from "./pi/clients.js";
2
+ 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";
5
+ import { PiAgentDefinitionInput, PiRuntime, createPi, defineAgent } from "./pi/dsl.js";
6
+ import { piFragmentDefinition } from "./pi/definition.js";
7
+ import { createPiFragment } from "./pi/factory.js";
8
+ import { piRoutesFactory } from "./routes.js";
9
+ 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 };
@@ -0,0 +1,9 @@
1
+ import { piFragmentDefinition } from "./pi/definition.js";
2
+ import { SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS } from "./pi/constants.js";
3
+ import { PI_WORKFLOW_NAME, createPiWorkflows } from "./pi/workflow.js";
4
+ import { piRoutesFactory } from "./routes.js";
5
+ import { createPiFragmentClients } from "./pi/clients.js";
6
+ import { createPi, defineAgent } from "./pi/dsl.js";
7
+ import { createPiFragment } from "./pi/factory.js";
8
+
9
+ export { PI_WORKFLOW_NAME, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS, createPi, createPiFragment, createPiFragmentClients, createPiWorkflows, defineAgent, piFragmentDefinition, piRoutesFactory };
@@ -0,0 +1,240 @@
1
+ import * as _fragno_dev_core_client0 from "@fragno-dev/core/client";
2
+ import { FragnoPublicClientConfig } from "@fragno-dev/core/client";
3
+ import * as zod from "zod";
4
+ import * as zod_v4_core0 from "zod/v4/core";
5
+ import * as _fragno_dev_core_api0 from "@fragno-dev/core/api";
6
+ import * as _standard_schema_spec0 from "@standard-schema/spec";
7
+
8
+ //#region src/pi/clients.d.ts
9
+ declare function createPiFragmentClients(fragnoConfig: FragnoPublicClientConfig): {
10
+ useSessions: _fragno_dev_core_client0.FragnoClientHookData<"GET", "/sessions", zod.ZodArray<zod.ZodObject<{
11
+ id: zod.ZodString;
12
+ name: zod.ZodNullable<zod.ZodString>;
13
+ status: zod.ZodEnum<{
14
+ active: "active";
15
+ paused: "paused";
16
+ errored: "errored";
17
+ terminated: "terminated";
18
+ complete: "complete";
19
+ waiting: "waiting";
20
+ }>;
21
+ agent: zod.ZodString;
22
+ workflowInstanceId: zod.ZodNullable<zod.ZodString>;
23
+ steeringMode: zod.ZodEnum<{
24
+ all: "all";
25
+ "one-at-a-time": "one-at-a-time";
26
+ }>;
27
+ metadata: zod.ZodNullable<zod.ZodAny>;
28
+ tags: zod.ZodArray<zod.ZodString>;
29
+ createdAt: zod.ZodDate;
30
+ updatedAt: zod.ZodDate;
31
+ }, zod_v4_core0.$strip>>, string, "limit">;
32
+ useSession: _fragno_dev_core_client0.FragnoClientHookData<"GET", "/sessions/:sessionId", zod.ZodObject<{
33
+ id: zod.ZodString;
34
+ name: zod.ZodNullable<zod.ZodString>;
35
+ status: zod.ZodEnum<{
36
+ active: "active";
37
+ paused: "paused";
38
+ errored: "errored";
39
+ terminated: "terminated";
40
+ complete: "complete";
41
+ waiting: "waiting";
42
+ }>;
43
+ agent: zod.ZodString;
44
+ workflowInstanceId: zod.ZodNullable<zod.ZodString>;
45
+ steeringMode: zod.ZodEnum<{
46
+ all: "all";
47
+ "one-at-a-time": "one-at-a-time";
48
+ }>;
49
+ metadata: zod.ZodNullable<zod.ZodAny>;
50
+ tags: zod.ZodArray<zod.ZodString>;
51
+ createdAt: zod.ZodDate;
52
+ updatedAt: zod.ZodDate;
53
+ workflow: zod.ZodObject<{
54
+ status: zod.ZodEnum<{
55
+ active: "active";
56
+ paused: "paused";
57
+ errored: "errored";
58
+ terminated: "terminated";
59
+ complete: "complete";
60
+ waiting: "waiting";
61
+ }>;
62
+ error: zod.ZodOptional<zod.ZodObject<{
63
+ name: zod.ZodString;
64
+ message: zod.ZodString;
65
+ }, zod_v4_core0.$strip>>;
66
+ output: zod.ZodOptional<zod.ZodAny>;
67
+ }, zod_v4_core0.$strip>;
68
+ messages: zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
69
+ role: zod.ZodLiteral<"user">;
70
+ content: zod.ZodUnion<readonly [zod.ZodString, zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
71
+ type: zod.ZodLiteral<"text">;
72
+ text: zod.ZodString;
73
+ textSignature: zod.ZodOptional<zod.ZodString>;
74
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
75
+ type: zod.ZodLiteral<"thinking">;
76
+ thinking: zod.ZodString;
77
+ thinkingSignature: zod.ZodOptional<zod.ZodString>;
78
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
79
+ type: zod.ZodLiteral<"image">;
80
+ data: zod.ZodString;
81
+ mimeType: zod.ZodString;
82
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
83
+ type: zod.ZodLiteral<"toolCall">;
84
+ id: zod.ZodString;
85
+ name: zod.ZodString;
86
+ arguments: zod.ZodRecord<zod.ZodString, zod.ZodUnknown>;
87
+ thoughtSignature: zod.ZodOptional<zod.ZodString>;
88
+ }, zod_v4_core0.$strip>]>>]>;
89
+ timestamp: zod.ZodNumber;
90
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
91
+ role: zod.ZodLiteral<"assistant">;
92
+ content: zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
93
+ type: zod.ZodLiteral<"text">;
94
+ text: zod.ZodString;
95
+ textSignature: zod.ZodOptional<zod.ZodString>;
96
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
97
+ type: zod.ZodLiteral<"thinking">;
98
+ thinking: zod.ZodString;
99
+ thinkingSignature: zod.ZodOptional<zod.ZodString>;
100
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
101
+ type: zod.ZodLiteral<"image">;
102
+ data: zod.ZodString;
103
+ mimeType: zod.ZodString;
104
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
105
+ type: zod.ZodLiteral<"toolCall">;
106
+ id: zod.ZodString;
107
+ name: zod.ZodString;
108
+ arguments: zod.ZodRecord<zod.ZodString, zod.ZodUnknown>;
109
+ thoughtSignature: zod.ZodOptional<zod.ZodString>;
110
+ }, zod_v4_core0.$strip>]>>;
111
+ api: zod.ZodString;
112
+ provider: zod.ZodString;
113
+ model: zod.ZodString;
114
+ usage: zod.ZodObject<{
115
+ input: zod.ZodNumber;
116
+ output: zod.ZodNumber;
117
+ cacheRead: zod.ZodNumber;
118
+ cacheWrite: zod.ZodNumber;
119
+ totalTokens: zod.ZodNumber;
120
+ cost: zod.ZodObject<{
121
+ input: zod.ZodNumber;
122
+ output: zod.ZodNumber;
123
+ cacheRead: zod.ZodNumber;
124
+ cacheWrite: zod.ZodNumber;
125
+ total: zod.ZodNumber;
126
+ }, zod_v4_core0.$strip>;
127
+ }, zod_v4_core0.$strip>;
128
+ stopReason: zod.ZodString;
129
+ errorMessage: zod.ZodOptional<zod.ZodString>;
130
+ timestamp: zod.ZodNumber;
131
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
132
+ role: zod.ZodLiteral<"toolResult">;
133
+ toolCallId: zod.ZodString;
134
+ toolName: zod.ZodString;
135
+ content: zod.ZodArray<zod.ZodUnion<readonly [zod.ZodObject<{
136
+ type: zod.ZodLiteral<"text">;
137
+ text: zod.ZodString;
138
+ textSignature: zod.ZodOptional<zod.ZodString>;
139
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
140
+ type: zod.ZodLiteral<"thinking">;
141
+ thinking: zod.ZodString;
142
+ thinkingSignature: zod.ZodOptional<zod.ZodString>;
143
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
144
+ type: zod.ZodLiteral<"image">;
145
+ data: zod.ZodString;
146
+ mimeType: zod.ZodString;
147
+ }, zod_v4_core0.$strip>, zod.ZodObject<{
148
+ type: zod.ZodLiteral<"toolCall">;
149
+ id: zod.ZodString;
150
+ name: zod.ZodString;
151
+ arguments: zod.ZodRecord<zod.ZodString, zod.ZodUnknown>;
152
+ thoughtSignature: zod.ZodOptional<zod.ZodString>;
153
+ }, zod_v4_core0.$strip>]>>;
154
+ details: zod.ZodOptional<zod.ZodUnknown>;
155
+ isError: zod.ZodBoolean;
156
+ timestamp: zod.ZodNumber;
157
+ }, zod_v4_core0.$strip>]>>;
158
+ trace: zod.ZodArray<zod.ZodObject<{
159
+ type: zod.ZodString;
160
+ timestamp: zod.ZodOptional<zod.ZodNumber>;
161
+ }, zod_v4_core0.$strip>>;
162
+ summaries: zod.ZodArray<zod.ZodObject<{
163
+ turn: zod.ZodNumber;
164
+ assistant: zod.ZodNullable<zod.ZodAny>;
165
+ summary: zod.ZodNullable<zod.ZodString>;
166
+ }, zod_v4_core0.$strip>>;
167
+ }, zod_v4_core0.$strip>, "WORKFLOWS_REQUIRED" | "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", string>;
168
+ useCreateSession: _fragno_dev_core_client0.FragnoClientMutatorData<_fragno_dev_core_api0.NonGetHTTPMethod, "/sessions", _standard_schema_spec0.StandardSchemaV1<unknown, unknown> | zod.ZodObject<{
169
+ agent: zod.ZodString;
170
+ name: zod.ZodOptional<zod.ZodString>;
171
+ metadata: zod.ZodOptional<zod.ZodAny>;
172
+ tags: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
173
+ steeringMode: zod.ZodOptional<zod.ZodEnum<{
174
+ all: "all";
175
+ "one-at-a-time": "one-at-a-time";
176
+ }>>;
177
+ }, zod_v4_core0.$strip> | undefined, zod.ZodObject<{
178
+ id: zod.ZodString;
179
+ name: zod.ZodNullable<zod.ZodString>;
180
+ status: zod.ZodEnum<{
181
+ active: "active";
182
+ paused: "paused";
183
+ errored: "errored";
184
+ terminated: "terminated";
185
+ complete: "complete";
186
+ waiting: "waiting";
187
+ }>;
188
+ agent: zod.ZodString;
189
+ workflowInstanceId: zod.ZodNullable<zod.ZodString>;
190
+ steeringMode: zod.ZodEnum<{
191
+ all: "all";
192
+ "one-at-a-time": "one-at-a-time";
193
+ }>;
194
+ metadata: zod.ZodNullable<zod.ZodAny>;
195
+ tags: zod.ZodArray<zod.ZodString>;
196
+ createdAt: zod.ZodDate;
197
+ updatedAt: zod.ZodDate;
198
+ }, zod_v4_core0.$strip> | zod.ZodArray<zod.ZodObject<{
199
+ id: zod.ZodString;
200
+ name: zod.ZodNullable<zod.ZodString>;
201
+ status: zod.ZodEnum<{
202
+ active: "active";
203
+ paused: "paused";
204
+ errored: "errored";
205
+ terminated: "terminated";
206
+ complete: "complete";
207
+ waiting: "waiting";
208
+ }>;
209
+ agent: zod.ZodString;
210
+ workflowInstanceId: zod.ZodNullable<zod.ZodString>;
211
+ steeringMode: zod.ZodEnum<{
212
+ all: "all";
213
+ "one-at-a-time": "one-at-a-time";
214
+ }>;
215
+ metadata: zod.ZodNullable<zod.ZodAny>;
216
+ tags: zod.ZodArray<zod.ZodString>;
217
+ createdAt: zod.ZodDate;
218
+ updatedAt: zod.ZodDate;
219
+ }, zod_v4_core0.$strip>> | undefined, string, string>;
220
+ useSendMessage: _fragno_dev_core_client0.FragnoClientMutatorData<_fragno_dev_core_api0.NonGetHTTPMethod, "/sessions/:sessionId/messages", zod.ZodObject<{
221
+ text: zod.ZodString;
222
+ done: zod.ZodOptional<zod.ZodBoolean>;
223
+ steeringMode: zod.ZodOptional<zod.ZodEnum<{
224
+ all: "all";
225
+ "one-at-a-time": "one-at-a-time";
226
+ }>>;
227
+ }, zod_v4_core0.$strip> | undefined, zod.ZodObject<{
228
+ status: zod.ZodEnum<{
229
+ active: "active";
230
+ paused: "paused";
231
+ errored: "errored";
232
+ terminated: "terminated";
233
+ complete: "complete";
234
+ waiting: "waiting";
235
+ }>;
236
+ }, zod_v4_core0.$strip> | undefined, "WORKFLOWS_REQUIRED" | "SESSION_NOT_FOUND" | "WORKFLOW_INSTANCE_MISSING", string>;
237
+ };
238
+ //#endregion
239
+ export { createPiFragmentClients };
240
+ //# sourceMappingURL=clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","names":[],"sources":["../../../src/pi/clients.ts"],"mappings":";;;;;;;;iBAKgB,uBAAA,CAAwB,YAAA,EAAc,wBAAA;;QAAwB,GAAA,CAAA,SAAA"}
@@ -0,0 +1,18 @@
1
+ import { piFragmentDefinition } from "./definition.js";
2
+ import { piRoutesFactory } from "../routes.js";
3
+ import { createClientBuilder } from "@fragno-dev/core/client";
4
+
5
+ //#region src/pi/clients.ts
6
+ function createPiFragmentClients(fragnoConfig) {
7
+ const b = createClientBuilder(piFragmentDefinition, fragnoConfig, [piRoutesFactory]);
8
+ return {
9
+ useSessions: b.createHook("/sessions"),
10
+ useSession: b.createHook("/sessions/:sessionId"),
11
+ useCreateSession: b.createMutator("POST", "/sessions"),
12
+ useSendMessage: b.createMutator("POST", "/sessions/:sessionId/messages")
13
+ };
14
+ }
15
+
16
+ //#endregion
17
+ export { createPiFragmentClients };
18
+ //# sourceMappingURL=clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.js","names":[],"sources":["../../../src/pi/clients.ts"],"sourcesContent":["import { createClientBuilder, type FragnoPublicClientConfig } from \"@fragno-dev/core/client\";\n\nimport { piFragmentDefinition } from \"./definition\";\nimport { piRoutesFactory } from \"../routes\";\n\nexport function createPiFragmentClients(fragnoConfig: FragnoPublicClientConfig) {\n const b = createClientBuilder(piFragmentDefinition, fragnoConfig, [piRoutesFactory]);\n\n return {\n useSessions: b.createHook(\"/sessions\"),\n useSession: b.createHook(\"/sessions/:sessionId\"),\n useCreateSession: b.createMutator(\"POST\", \"/sessions\"),\n useSendMessage: b.createMutator(\"POST\", \"/sessions/:sessionId/messages\"),\n };\n}\n"],"mappings":";;;;;AAKA,SAAgB,wBAAwB,cAAwC;CAC9E,MAAM,IAAI,oBAAoB,sBAAsB,cAAc,CAAC,gBAAgB,CAAC;AAEpF,QAAO;EACL,aAAa,EAAE,WAAW,YAAY;EACtC,YAAY,EAAE,WAAW,uBAAuB;EAChD,kBAAkB,EAAE,cAAc,QAAQ,YAAY;EACtD,gBAAgB,EAAE,cAAc,QAAQ,gCAAgC;EACzE"}
@@ -0,0 +1,9 @@
1
+ //#region src/pi/constants.d.ts
2
+ declare const SESSION_STATUSES: readonly ["active", "paused", "errored", "terminated", "complete", "waiting"];
3
+ declare const STEERING_MODES: readonly ["all", "one-at-a-time"];
4
+ declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
5
+ type PiSessionStatus = (typeof SESSION_STATUSES)[number];
6
+ type PiSteeringMode = (typeof STEERING_MODES)[number];
7
+ //#endregion
8
+ export { PiSessionStatus, PiSteeringMode, SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS };
9
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","names":[],"sources":["../../../src/pi/constants.ts"],"mappings":";cAAa,gBAAA;AAAA,cAQA,cAAA;AAAA,cACA,eAAA;AAAA,KAED,eAAA,WAA0B,gBAAA;AAAA,KAC1B,cAAA,WAAyB,cAAA"}
@@ -0,0 +1,22 @@
1
+ //#region src/pi/constants.ts
2
+ const SESSION_STATUSES = [
3
+ "active",
4
+ "paused",
5
+ "errored",
6
+ "terminated",
7
+ "complete",
8
+ "waiting"
9
+ ];
10
+ const STEERING_MODES = ["all", "one-at-a-time"];
11
+ const THINKING_LEVELS = [
12
+ "off",
13
+ "minimal",
14
+ "low",
15
+ "medium",
16
+ "high",
17
+ "xhigh"
18
+ ];
19
+
20
+ //#endregion
21
+ export { SESSION_STATUSES, STEERING_MODES, THINKING_LEVELS };
22
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../../src/pi/constants.ts"],"sourcesContent":["export const SESSION_STATUSES = [\n \"active\",\n \"paused\",\n \"errored\",\n \"terminated\",\n \"complete\",\n \"waiting\",\n] as const;\nexport const STEERING_MODES = [\"all\", \"one-at-a-time\"] as const;\nexport const THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const;\n\nexport type PiSessionStatus = (typeof SESSION_STATUSES)[number];\nexport type PiSteeringMode = (typeof STEERING_MODES)[number];\nexport type PiThinkingLevel = (typeof THINKING_LEVELS)[number];\n"],"mappings":";AAAA,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACD;AACD,MAAa,iBAAiB,CAAC,OAAO,gBAAgB;AACtD,MAAa,kBAAkB;CAAC;CAAO;CAAW;CAAO;CAAU;CAAQ;CAAQ"}
@@ -0,0 +1,13 @@
1
+ import { PiFragmentConfig, PiWorkflowsService } from "./types.js";
2
+ import * as _fragno_dev_core0 from "@fragno-dev/core";
3
+ import * as _fragno_dev_db0 from "@fragno-dev/db";
4
+ import * as _fragno_dev_db_schema0 from "@fragno-dev/db/schema";
5
+ import * as _fragno_dev_db_fragment_definition_builder0 from "@fragno-dev/db/fragment-definition-builder";
6
+
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"]>>>>>>, {}, {}, {
9
+ workflows: PiWorkflowsService;
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
+ //#endregion
12
+ export { piFragmentDefinition };
13
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,10 @@
1
+ import { piSchema } from "../schema.js";
2
+ import { defineFragment } from "@fragno-dev/core";
3
+ import { withDatabase } from "@fragno-dev/db";
4
+
5
+ //#region src/pi/definition.ts
6
+ const piFragmentDefinition = defineFragment("pi-fragment").extend(withDatabase(piSchema)).usesService("workflows").build();
7
+
8
+ //#endregion
9
+ export { piFragmentDefinition };
10
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","names":[],"sources":["../../../src/pi/definition.ts"],"sourcesContent":["import { defineFragment } from \"@fragno-dev/core\";\nimport { withDatabase } from \"@fragno-dev/db\";\n\nimport { piSchema } from \"../schema\";\nimport type { PiFragmentConfig, PiWorkflowsService } from \"./types\";\n\nexport const piFragmentDefinition = defineFragment<PiFragmentConfig>(\"pi-fragment\")\n .extend(withDatabase(piSchema))\n .usesService<\"workflows\", PiWorkflowsService>(\"workflows\")\n .build();\n"],"mappings":";;;;;AAMA,MAAa,uBAAuB,eAAiC,cAAc,CAChF,OAAO,aAAa,SAAS,CAAC,CAC9B,YAA6C,YAAY,CACzD,OAAO"}
@@ -0,0 +1,24 @@
1
+ import { PiSteeringMode } from "./constants.js";
2
+ import { PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiToolFactory, PiToolRegistry } from "./types.js";
3
+ import { PiWorkflowsRegistry } from "./workflow.js";
4
+
5
+ //#region src/pi/dsl.d.ts
6
+ type PiAgentDefinitionInput = Omit<PiAgentDefinition, "name"> & {
7
+ name?: string;
8
+ };
9
+ type PiRuntime = {
10
+ config: PiFragmentConfig;
11
+ workflows: PiWorkflowsRegistry;
12
+ };
13
+ declare const defineAgent: (name: string, definition: PiAgentDefinitionInput) => PiAgentDefinition;
14
+ declare const createPi: () => {
15
+ agent(definition: PiAgentDefinition): /*elided*/any;
16
+ agents(registry: PiAgentRegistry): /*elided*/any;
17
+ tool(name: string, tool: PiToolFactory): /*elided*/any;
18
+ tools(registry: PiToolRegistry): /*elided*/any;
19
+ defaultSteeringMode(mode: PiSteeringMode): /*elided*/any;
20
+ build(): PiRuntime;
21
+ };
22
+ //#endregion
23
+ export { PiAgentDefinitionInput, PiRuntime, createPi, defineAgent };
24
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,57 @@
1
+ import { createPiWorkflows } from "./workflow.js";
2
+
3
+ //#region src/pi/dsl.ts
4
+ const defineAgent = (name, definition) => {
5
+ if (definition.name && definition.name !== name) throw new Error(`defineAgent name mismatch: expected ${name}, got ${definition.name}`);
6
+ return {
7
+ ...definition,
8
+ name
9
+ };
10
+ };
11
+ const createPi = () => {
12
+ const agents = {};
13
+ const tools = {};
14
+ let defaultSteeringMode;
15
+ const builder = {
16
+ agent(definition) {
17
+ agents[definition.name] = definition;
18
+ return builder;
19
+ },
20
+ agents(registry) {
21
+ Object.assign(agents, registry);
22
+ return builder;
23
+ },
24
+ tool(name, tool) {
25
+ tools[name] = tool;
26
+ return builder;
27
+ },
28
+ tools(registry) {
29
+ Object.assign(tools, registry);
30
+ return builder;
31
+ },
32
+ defaultSteeringMode(mode) {
33
+ defaultSteeringMode = mode;
34
+ return builder;
35
+ },
36
+ build() {
37
+ const agentsSnapshot = { ...agents };
38
+ const toolsSnapshot = { ...tools };
39
+ return {
40
+ config: {
41
+ agents: agentsSnapshot,
42
+ tools: toolsSnapshot,
43
+ defaultSteeringMode
44
+ },
45
+ workflows: createPiWorkflows({
46
+ agents: agentsSnapshot,
47
+ tools: toolsSnapshot
48
+ })
49
+ };
50
+ }
51
+ };
52
+ return builder;
53
+ };
54
+
55
+ //#endregion
56
+ export { createPi, defineAgent };
57
+ //# sourceMappingURL=dsl.js.map
@@ -0,0 +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"}