@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":"routes-CpL_YGWK.d.ts","names":["SplitPath","T","Rest","First","ExtractParam","Name","ExtractParamsFromSegments","ExtractPathParams","ValueType","Record","ExtractPathParamsOrWiden","MaybeExtractPathParamsOrWiden","HasPathParams","ExtractPathParamNames","QueryParamsHint","TQueryParameters","Partial","StandardSchemaV1","InferOr","T","U","NonNullable","InferOutput","InferOrUnknown","InfoStatusCode","SuccessStatusCode","DeprecatedStatusCode","RedirectStatusCode","ClientErrorStatusCode","ServerErrorStatusCode","StatusCode","ContentlessStatusCode","StatusCode","FragnoErrorOptions","Error","cause","FragnoClientError","TCode","private","constructor","message","code","options","FragnoClientFetchError","fromUnknownFetchError","error","FragnoClientFetchNetworkError","FragnoClientFetchAbortError","FragnoClientUnknownApiError","status","FragnoClientApiError","TErrorCode","Response","Promise","fromResponse","response","RequestBodyType","MutableRequestState","Record","URLSearchParams","Headers","private","constructor","pathParams","searchParams","body","headers","config","setBody","hasBodyOverride","ExtractPathParams","MutableRequestState","HTTPMethod","StandardSchemaV1","RequestBodyType","FormData","Blob","Uint8Array","ReadableStream","RequestInputContext","TPath","TInputSchema","URLSearchParams","Headers","Request","Promise","Exclude","InferOutput","private","constructor","path","method","pathParams","searchParams","parsedBody","rawBody","headers","request","inputSchema","shouldValidateInput","config","fromRequest","state","fromSSRContext","body","query","formData","isFormData","bodyStream","isBodyStream","input","schema","valid","Error","Message","__errorMessage","ResponseStream","TArray","ReadableStream","WritableStream","Uint8Array","Promise","private","aborted","closed","responseReadable","constructor","writable","readable","writeRaw","input","write","U","sleep","ms","close","onAbort","listener","abort","ContentlessStatusCode","StatusCode","InferOrUnknown","ResponseStream","StandardSchemaV1","ResponseInit","T","HeadersInit","headers","status","statusText","OutputContext","TOutput","TErrorCode","message","code","Response","Promise","onError","Error","error","initOrStatus","empty","json","object","jsonStream","stream","cb","RequestOutputContext","TOutputSchema","private","constructor","outputSchema","RequestInputContext","RequestOutputContext","FragnoApiError","FragnoApiValidationError","FragnoPublicConfig","RouteHandlerInputOptions","RouteCallerConfig","RouteCallerForFragment","createRouteCaller","StandardSchemaV1","StandardSchemaV1$1","HTTPMethod","NonGetHTTPMethod","Exclude","PathError","T","TMessage","ValidPath","Rest","RequestThisContext","RouteContentType","FragnoRouteConfig","TMethod","TPath","TInputSchema","TOutputSchema","TErrorCode","TQueryParameters","TThisContext","Response","Promise","method","path","contentType","inputSchema","outputSchema","errorCodes","queryParameters","handler","this","inputCtx","outputCtx","addRoute","route","HTTPMethod","StandardSchemaV1","FragnoPublicConfig","mountRoute","FetcherConfig","RequestInit","fetch","type","options","fetcher","FragnoPublicClientConfig","baseUrl","fetcherConfig","FragnoFragmentSharedConfig","TRoutes","method","path","inputSchema","outputSchema","errorCodes","queryParameters","pathParameters","name","routes","PlatformCompat","MapStore","ReadableAtom","NoKey","SomeKey","KeyInput","FetcherStore","Array","Key","KeyParts","KeySelector","key","Fetcher","T","Promise","args","OnErrorRetry","error","retryCount","opts","EventTypes","onError","RefetchSettings","dedupeTime","revalidateOnFocus","revalidateOnReconnect","revalidateInterval","cacheLifetime","onErrorRetry","CommonSettings","fetcher","NanoqueryArgs","Map","cache","data","created","expires","FetcherValue","E","Error","loading","promise","LazyFetchValue","Symbol","_","invalidate","revalidate","mutate","fetch","FetcherStoreCreator","keys","settings","ManualMutator","Data","Result","getCacheUpdater","shouldRevalidate","newValue","MutateCb","MutatorStore","defaultOnErrorRetry","nanoqueryFactory","E_1","globalFetcher","isAppVisible","visibilityChangeSubscribe","reconnectChangeSubscribe","globalSettings","keyInput","fetcherSettings","mutator","throttleCalls","__unsafeOverruleSettings","invalidateKeys","keySelector","revalidateKeys","mutateCache","MaybeExtractPathParamsOrWiden","InferOr","AnyFragnoRouteConfig","AnyRouteOrFactory","FlattenRouteFactories","FetcherConfig","FragnoFragmentSharedConfig","FragnoFragmentSharedConfig$1","FragnoPublicClientConfig","FragnoPublicConfig","FragmentDefinition","FragnoClientApiError","FragnoClientError","FragnoClientFetchAbortError","FragnoClientFetchError","FragnoClientFetchNetworkError","FragnoClientUnknownApiError","FragnoErrorOptions","FragnoRouteConfig","HTTPMethod","NonGetHTTPMethod","RequestThisContext","ReadableAtom","Store","FetcherStore","MutatorStore","StandardSchemaV1","GET_HOOK_SYMBOL","MUTATOR_HOOK_SYMBOL","STORE_SYMBOL","FilterRouteByMethod","TRoute$1","TExpectedMethod","TMethod","Extract","TPath","TInputSchema","TOutputSchema","TErrorCode","TQueryParameters","TThisContext","FilterRouteByPath","TPath$1","TRoutePath","ExtractGetRoutesExact","T","K","ExtractGetRoutes","ExtractRoutePathExact","ExtractRoutePathLoose","_TMethod","HasWidenedRouteShape","TRoute","ExtractRoutePath","ExtractGetRoutePaths","ExtractNonGetRoutePaths","ExtractRouteByPathExact","TRoutes","TMethod$1","TRouteMethod","ExtractRouteByPathLoose","ExtractRouteByPath","ExtractOutputSchemaForPath","outputSchema","IsValidGetRoutePath","ValidateGetRoutePath","HasGetRoutes","ObjectContainingStoreField","P","Omit","Partial","FragnoStoreObjectData","obj","FragnoStoreFactoryData","TArgs","factory","args","FragnoStoreData","FragnoClientHookData","TOutputSchema$1","TErrorCode$1","TQueryParameters$1","Record","InferOutput","Promise","route","query","path","store","_outputSchema","FragnoClientMutatorData","TInputSchema$1","mutateQuery","body","mutatorStore","_inputSchema","buildUrl","baseUrl","mountRoute","config","pathParams","queryParams","params","getCacheKey","method","isGetHook","hook","isMutatorHook","isStore","TStore","OnErrorRetryFn","error","key","retryCount","opts","CreateHookOptions","onErrorRetry","OnInvalidateFn","TInnerPath","invalidate","CacheLine","data","created","expires","ClientBuilder","TFragmentConfig","Readonly","fetch","RequestInit","NonNullable","private","constructor","publicConfig","fragmentConfig","cacheEntries","createStore","getFetcher","fetcher","defaultOptions","createHook","options","createMutator","onInvalidate","createClientBuilder","TConfig","TOptions","TDeps","TBaseServices","TServices","TServiceDependencies","TPrivateServices","TServiceThisContext","THandlerThisContext","TRequestStorage","TRoutesOrFactories","TInternalRoutes","definition","routesOrFactories","authorFetcherConfig"],"sources":["../../../fragno/dist/api/internal/path.d.ts","../../../fragno/dist/util/types-util.d.ts","../../../fragno/dist/http/http-status.d.ts","../../../fragno/dist/client/client-error.d.ts","../../../fragno/dist/api/mutable-request-state.d.ts","../../../fragno/dist/api/request-input-context.d.ts","../../../fragno/dist/api/internal/response-stream.d.ts","../../../fragno/dist/api/request-output-context.d.ts","../../../fragno/dist/api/api.d.ts","../../../fragno/dist/api/shared-types.d.ts","../../../../node_modules/.pnpm/@nanostores+query@0.3.4_nanostores@1.2.0/node_modules/@nanostores/query/dist/factory.d.ts","../../../fragno/dist/client/client.d.ts","../../src/debug-log.ts","../../src/pi/constants.ts","../../src/pi/workflow/agent-runner.ts","../../src/pi/workflow/workflow.ts","../../src/pi/types.ts","../../src/client/session-store.ts","../../src/client/session-controller.ts","../../src/client/clients.ts","../../src/pi/dsl.ts","../../src/pi/definition.ts","../../src/pi/factory.ts","../../src/routes.ts"],"x_google_ignoreList":[10],"mappings":"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"}
|
package/dist/cli/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","names":[],"sources":["../../src/cli/mod.ts"],"mappings":";;;;KAMY,eAAA;EACV,MAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA,GAAS,YAAA;AAAA;AAAA,KAGC,gBAAA;EACV,KAAA;AAAA;AAAA,KAGU,kBAAA;EACV,KAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,YAAA;AAAA;AAAA,KAGU,eAAA;EACV,SAAA;EACA,UAAA;AAAA;AAAA,KAGU,uBAAA;EACV,SAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,YAAA;AAAA;AAAA,KAGU,UAAA;EACV,MAAA,EAAQ,iBAAA;EACR,MAAA,EAAQ,IAAA,CAAK,OAAA;AAAA;AAAA,KAGH,UAAA;EACV,YAAA,GACE,IAAA,EAAM,gBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,cAAA,GACE,IAAA,EAAM,kBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,WAAA,GACE,IAAA,EAAM,eAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,mBAAA,GACE,IAAA,EAAM,uBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;AAAA;AAAA,KAG7B,UAAA;EACV,MAAA,GAAS,IAAA,CAAK,OAAA;EACd,OAAA,GAAU,UAAA;AAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","names":[],"sources":["../../src/cli/mod.ts"],"mappings":";;;;KAMY,eAAA;EACV,MAAA;EACA,MAAA;EACA,QAAA;EACA,MAAA,GAAS,YAAA;AAAA;AAAA,KAGC,gBAAA;EACV,KAAA;AAAA;AAAA,KAGU,kBAAA;EACV,KAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,YAAA;AAAA;AAAA,KAGU,eAAA;EACV,SAAA;EACA,UAAA;AAAA;AAAA,KAGU,uBAAA;EACV,SAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,YAAA;AAAA;AAAA,KAGU,UAAA;EACV,MAAA,EAAQ,iBAAA;EACR,MAAA,EAAQ,IAAA,CAAK,OAAA;AAAA;AAAA,KAGH,UAAA;EACV,YAAA,GACE,IAAA,EAAM,gBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,cAAA,GACE,IAAA,EAAM,kBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,WAAA,GACE,IAAA,EAAM,eAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;EACvC,mBAAA,GACE,IAAA,EAAM,uBAAA,EACN,GAAA,EAAK,UAAA,KACF,OAAA,CAAQ,eAAA,WAA0B,eAAA;AAAA;AAAA,KAG7B,UAAA;EACV,MAAA,GAAS,IAAA,CAAK,OAAA;EACd,OAAA,GAAU,UAAA;AAAA;AAAA,KAsnBP,UAAA;EACH,OAAA;EACA,MAAA;EACA,OAAA,EAAS,MAAA;EACT,WAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,iBA+RoB,GAAA,CACpB,IAAA,YACA,eAAA,GAAiB,IAAA,CAAK,OAAA,qBAA4B,UAAA,GACjD,OAAA;AAAA,cA0IU,SAAA;;iCA3UuB,UAAA;yBAAA,YAAA"}
|
package/dist/cli/mod.js
CHANGED
|
@@ -34,7 +34,9 @@ sessions create:
|
|
|
34
34
|
|
|
35
35
|
sessions get:
|
|
36
36
|
-s, --session <id> Session id (or positional)
|
|
37
|
-
--status-only Only output status fields
|
|
37
|
+
--status-only Only output status/workflow/current-run state fields
|
|
38
|
+
Non-JSON output includes current-run messages, events, trace,
|
|
39
|
+
and summaries when present
|
|
38
40
|
|
|
39
41
|
sessions send-message:
|
|
40
42
|
-s, --session <id> Session id (or positional)
|
|
@@ -187,6 +189,241 @@ const buildDetailOutput = (data, json) => {
|
|
|
187
189
|
data
|
|
188
190
|
} };
|
|
189
191
|
};
|
|
192
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
193
|
+
const toPrettyJson = (value) => JSON.stringify(value, null, 2);
|
|
194
|
+
const pad = (value, width) => value.padEnd(width, " ");
|
|
195
|
+
const buildTableText = (columns, rows) => {
|
|
196
|
+
const widths = columns.map((column, index) => {
|
|
197
|
+
return rows.reduce((max, row) => Math.max(max, row[index]?.length ?? 0), column.length);
|
|
198
|
+
});
|
|
199
|
+
return [
|
|
200
|
+
columns.map((column, index) => pad(column, widths[index] ?? column.length)).join(" "),
|
|
201
|
+
columns.map((column, index) => "-".repeat(widths[index] ?? column.length)).join(" "),
|
|
202
|
+
...rows.map((row) => columns.map((_, index) => pad(row[index] ?? "", widths[index] ?? 0)).join(" "))
|
|
203
|
+
].join("\n");
|
|
204
|
+
};
|
|
205
|
+
const toOneLine = (value) => value.replace(/\s+/g, " ").trim();
|
|
206
|
+
const truncate = (value, max = 240) => {
|
|
207
|
+
if (value.length <= max) return value;
|
|
208
|
+
return `${value.slice(0, Math.max(0, max - 3))}...`;
|
|
209
|
+
};
|
|
210
|
+
const toDisplayValue = (value) => {
|
|
211
|
+
if (value === null || value === void 0) return "";
|
|
212
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return String(value);
|
|
213
|
+
return JSON.stringify(value);
|
|
214
|
+
};
|
|
215
|
+
const SYSTEM_TIME_FORMATTER = new Intl.DateTimeFormat(void 0, {
|
|
216
|
+
year: "numeric",
|
|
217
|
+
month: "2-digit",
|
|
218
|
+
day: "2-digit",
|
|
219
|
+
hour: "2-digit",
|
|
220
|
+
minute: "2-digit",
|
|
221
|
+
second: "2-digit",
|
|
222
|
+
hour12: false,
|
|
223
|
+
timeZoneName: "short"
|
|
224
|
+
});
|
|
225
|
+
const toDateFromTimestamp = (value) => {
|
|
226
|
+
if (value instanceof Date && !Number.isNaN(value.getTime())) return value;
|
|
227
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
228
|
+
const millisecondCandidate = Math.abs(value) < 1e11 ? value * 1e3 : value;
|
|
229
|
+
const date = new Date(millisecondCandidate);
|
|
230
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
231
|
+
}
|
|
232
|
+
if (typeof value === "string") {
|
|
233
|
+
const date = new Date(value);
|
|
234
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
};
|
|
238
|
+
const toTimestampLabel = (value) => {
|
|
239
|
+
if (value === void 0 || value === null || value === "") return "-";
|
|
240
|
+
const date = toDateFromTimestamp(value);
|
|
241
|
+
if (date) return SYSTEM_TIME_FORMATTER.format(date);
|
|
242
|
+
return toDisplayValue(value);
|
|
243
|
+
};
|
|
244
|
+
const buildSection = (title) => [title, "-".repeat(title.length)];
|
|
245
|
+
const compactJson = (value) => {
|
|
246
|
+
try {
|
|
247
|
+
return JSON.stringify(value);
|
|
248
|
+
} catch {
|
|
249
|
+
return String(value);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const extractMessageText = (message) => {
|
|
253
|
+
if (!isRecord(message)) return toDisplayValue(message);
|
|
254
|
+
const content = message["content"];
|
|
255
|
+
if (typeof content === "string") return content;
|
|
256
|
+
if (!Array.isArray(content)) {
|
|
257
|
+
const details = message["details"];
|
|
258
|
+
if (isRecord(details)) {
|
|
259
|
+
const stdout = details["stdout"];
|
|
260
|
+
if (typeof stdout === "string" && stdout.trim()) return stdout;
|
|
261
|
+
}
|
|
262
|
+
return "";
|
|
263
|
+
}
|
|
264
|
+
const parts = [];
|
|
265
|
+
for (const block of content) {
|
|
266
|
+
if (!isRecord(block)) continue;
|
|
267
|
+
const type = block["type"];
|
|
268
|
+
if (type === "text" && typeof block["text"] === "string" && block["text"]) {
|
|
269
|
+
parts.push(block["text"]);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (type === "toolCall") {
|
|
273
|
+
const name = typeof block["name"] === "string" ? block["name"] : "unknown";
|
|
274
|
+
const args = block["arguments"];
|
|
275
|
+
let argsText = "";
|
|
276
|
+
if (isRecord(args) && typeof args["script"] === "string") argsText = args["script"];
|
|
277
|
+
else if (args !== void 0) argsText = compactJson(args);
|
|
278
|
+
parts.push(argsText ? `[toolCall:${name}] ${argsText}` : `[toolCall:${name}]`);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (type === "image") {
|
|
282
|
+
const mimeType = typeof block["mimeType"] === "string" ? block["mimeType"] : "unknown";
|
|
283
|
+
parts.push(`[image:${mimeType}]`);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return parts.join(" | ");
|
|
288
|
+
};
|
|
289
|
+
const extractEventPayload = (payload) => {
|
|
290
|
+
if (payload === null || payload === void 0) return "";
|
|
291
|
+
if (typeof payload === "string" || typeof payload === "number" || typeof payload === "boolean") return String(payload);
|
|
292
|
+
if (isRecord(payload) && typeof payload["text"] === "string") return payload["text"];
|
|
293
|
+
return compactJson(payload);
|
|
294
|
+
};
|
|
295
|
+
const extractTraceDetails = (value) => {
|
|
296
|
+
if (!isRecord(value)) return toDisplayValue(value);
|
|
297
|
+
const { type: _type, timestamp: _timestamp, ...rest } = value;
|
|
298
|
+
if (Object.keys(rest).length === 0) return "-";
|
|
299
|
+
return truncate(toOneLine(compactJson(rest)), 160);
|
|
300
|
+
};
|
|
301
|
+
const buildSessionsGetTextOutput = (data) => {
|
|
302
|
+
if (!isRecord(data)) return typeof data === "string" ? data : toPrettyJson(data);
|
|
303
|
+
const lines = [];
|
|
304
|
+
lines.push(...buildSection("Session"));
|
|
305
|
+
if (data["id"] !== void 0) lines.push(`ID ${toDisplayValue(data["id"])}`);
|
|
306
|
+
if (data["agent"] !== void 0) lines.push(`Agent ${toDisplayValue(data["agent"])}`);
|
|
307
|
+
if (data["status"] !== void 0) lines.push(`Status ${toDisplayValue(data["status"])}`);
|
|
308
|
+
if (data["phase"] !== void 0) lines.push(`Phase ${toDisplayValue(data["phase"])}`);
|
|
309
|
+
if (data["turn"] !== void 0) lines.push(`Turn ${toDisplayValue(data["turn"])}`);
|
|
310
|
+
if (data["waitingFor"] !== void 0) lines.push(`Waiting ${data["waitingFor"] === null ? "-" : truncate(toOneLine(compactJson(data["waitingFor"])))}`);
|
|
311
|
+
if (data["steeringMode"] !== void 0) lines.push(`Steering ${toDisplayValue(data["steeringMode"])}`);
|
|
312
|
+
if (data["createdAt"] !== void 0) lines.push(`Created ${toTimestampLabel(data["createdAt"])}`);
|
|
313
|
+
if (data["updatedAt"] !== void 0) lines.push(`Updated ${toTimestampLabel(data["updatedAt"])}`);
|
|
314
|
+
const workflow = isRecord(data["workflow"]) ? data["workflow"] : null;
|
|
315
|
+
if (workflow?.["status"] !== void 0) lines.push(`Workflow ${toDisplayValue(workflow["status"])}`);
|
|
316
|
+
if ("messages" in data) {
|
|
317
|
+
const messages = Array.isArray(data["messages"]) ? data["messages"] : [];
|
|
318
|
+
lines.push("");
|
|
319
|
+
lines.push(...buildSection(`Messages (${messages.length})`));
|
|
320
|
+
if (messages.length === 0) lines.push("(none)");
|
|
321
|
+
else {
|
|
322
|
+
const rows = messages.map((message, index) => {
|
|
323
|
+
const record = isRecord(message) ? message : null;
|
|
324
|
+
const role = typeof record?.["role"] === "string" ? record["role"] : "unknown";
|
|
325
|
+
const timestamp = toTimestampLabel(record?.["timestamp"]);
|
|
326
|
+
const text = truncate(toOneLine(extractMessageText(message) || "(no text content)"));
|
|
327
|
+
return [
|
|
328
|
+
String(index + 1),
|
|
329
|
+
role,
|
|
330
|
+
timestamp,
|
|
331
|
+
text
|
|
332
|
+
];
|
|
333
|
+
});
|
|
334
|
+
lines.push(buildTableText([
|
|
335
|
+
"#",
|
|
336
|
+
"Writer",
|
|
337
|
+
"Timestamp",
|
|
338
|
+
"Message"
|
|
339
|
+
], rows));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if ("events" in data) {
|
|
343
|
+
const events = Array.isArray(data["events"]) ? data["events"] : [];
|
|
344
|
+
lines.push("");
|
|
345
|
+
lines.push(...buildSection(`Events (${events.length})`));
|
|
346
|
+
if (events.length === 0) lines.push("(none)");
|
|
347
|
+
else {
|
|
348
|
+
const rows = events.map((event, index) => {
|
|
349
|
+
const record = isRecord(event) ? event : null;
|
|
350
|
+
const type = typeof record?.["type"] === "string" ? record["type"] : "unknown";
|
|
351
|
+
const createdAt = toTimestampLabel(record?.["createdAt"] ?? record?.["timestamp"]);
|
|
352
|
+
const deliveredAt = toTimestampLabel(record?.["deliveredAt"]);
|
|
353
|
+
const consumedBy = toDisplayValue(record?.["consumedByStepKey"]) || "-";
|
|
354
|
+
const payload = truncate(toOneLine(extractEventPayload(record?.["payload"]) || "-"), 160);
|
|
355
|
+
return [
|
|
356
|
+
String(index + 1),
|
|
357
|
+
type,
|
|
358
|
+
createdAt,
|
|
359
|
+
deliveredAt,
|
|
360
|
+
consumedBy,
|
|
361
|
+
payload
|
|
362
|
+
];
|
|
363
|
+
});
|
|
364
|
+
lines.push(buildTableText([
|
|
365
|
+
"#",
|
|
366
|
+
"Type",
|
|
367
|
+
"Created",
|
|
368
|
+
"Delivered",
|
|
369
|
+
"Consumed By",
|
|
370
|
+
"Payload"
|
|
371
|
+
], rows));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if ("trace" in data) {
|
|
375
|
+
const trace = Array.isArray(data["trace"]) ? data["trace"] : [];
|
|
376
|
+
lines.push("");
|
|
377
|
+
lines.push(...buildSection(`Trace (${trace.length})`));
|
|
378
|
+
if (trace.length === 0) lines.push("(none)");
|
|
379
|
+
else {
|
|
380
|
+
const rows = trace.map((event, index) => {
|
|
381
|
+
const record = isRecord(event) ? event : null;
|
|
382
|
+
const type = typeof record?.["type"] === "string" ? record["type"] : "unknown";
|
|
383
|
+
const timestamp = toTimestampLabel(record?.["timestamp"]);
|
|
384
|
+
const details = extractTraceDetails(event);
|
|
385
|
+
return [
|
|
386
|
+
String(index + 1),
|
|
387
|
+
type,
|
|
388
|
+
timestamp,
|
|
389
|
+
details
|
|
390
|
+
];
|
|
391
|
+
});
|
|
392
|
+
lines.push(buildTableText([
|
|
393
|
+
"#",
|
|
394
|
+
"Type",
|
|
395
|
+
"Timestamp",
|
|
396
|
+
"Details"
|
|
397
|
+
], rows));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if ("summaries" in data) {
|
|
401
|
+
const summaries = Array.isArray(data["summaries"]) ? data["summaries"] : [];
|
|
402
|
+
lines.push("");
|
|
403
|
+
lines.push(...buildSection(`Summaries (${summaries.length})`));
|
|
404
|
+
if (summaries.length === 0) lines.push("(none)");
|
|
405
|
+
else {
|
|
406
|
+
const rows = summaries.map((entry) => {
|
|
407
|
+
const record = isRecord(entry) ? entry : null;
|
|
408
|
+
const turn = toDisplayValue(record?.["turn"]);
|
|
409
|
+
const summary = typeof record?.["summary"] === "string" && record["summary"].trim() ? record["summary"] : extractMessageText(record?.["assistant"]);
|
|
410
|
+
return [turn || "-", truncate(toOneLine(summary || "-"), 160)];
|
|
411
|
+
});
|
|
412
|
+
lines.push(buildTableText(["Turn", "Summary"], rows));
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return lines.join("\n");
|
|
416
|
+
};
|
|
417
|
+
const buildSessionsGetOutput = (data, json) => {
|
|
418
|
+
if (json) return { output: {
|
|
419
|
+
format: "json",
|
|
420
|
+
data
|
|
421
|
+
} };
|
|
422
|
+
return { output: {
|
|
423
|
+
format: "text",
|
|
424
|
+
text: buildSessionsGetTextOutput(data)
|
|
425
|
+
} };
|
|
426
|
+
};
|
|
190
427
|
const buildSendMessageOutput = (data, json) => {
|
|
191
428
|
if (json) return { output: {
|
|
192
429
|
format: "json",
|
|
@@ -270,12 +507,13 @@ const defaultActions = {
|
|
|
270
507
|
path
|
|
271
508
|
});
|
|
272
509
|
if (!response.ok) return response.error;
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
510
|
+
return buildSessionsGetOutput(args.statusOnly && response.data && typeof response.data === "object" ? {
|
|
511
|
+
status: response.data["status"],
|
|
512
|
+
workflow: response.data["workflow"],
|
|
513
|
+
phase: response.data["phase"],
|
|
514
|
+
turn: response.data["turn"],
|
|
515
|
+
waitingFor: response.data["waitingFor"]
|
|
516
|
+
} : response.data, ctx.config.json);
|
|
279
517
|
},
|
|
280
518
|
sessionsSendMessage: async (args, ctx) => {
|
|
281
519
|
const resolved = await resolveMessageText(args);
|
package/dist/cli/mod.js.map
CHANGED
|
@@ -1 +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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"}
|
|
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/workflow/current-run state fields\n Non-JSON output includes current-run messages, events, trace,\n and summaries when present\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 isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst toPrettyJson = (value: unknown): string => JSON.stringify(value, null, 2);\n\nconst pad = (value: string, width: number): string => value.padEnd(width, \" \");\n\nconst buildTableText = (columns: string[], rows: string[][]): string => {\n const widths = columns.map((column, index) => {\n return rows.reduce((max, row) => Math.max(max, row[index]?.length ?? 0), column.length);\n });\n\n const header = columns\n .map((column, index) => pad(column, widths[index] ?? column.length))\n .join(\" \");\n const divider = columns\n .map((column, index) => \"-\".repeat(widths[index] ?? column.length))\n .join(\" \");\n const body = rows.map((row) =>\n columns.map((_, index) => pad(row[index] ?? \"\", widths[index] ?? 0)).join(\" \"),\n );\n\n return [header, divider, ...body].join(\"\\n\");\n};\n\nconst toOneLine = (value: string): string => value.replace(/\\s+/g, \" \").trim();\n\nconst truncate = (value: string, max = 240): string => {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, Math.max(0, max - 3))}...`;\n};\n\nconst toDisplayValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return JSON.stringify(value);\n};\n\nconst SYSTEM_TIME_FORMATTER = new Intl.DateTimeFormat(undefined, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n timeZoneName: \"short\",\n});\n\nconst toDateFromTimestamp = (value: unknown): Date | null => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const millisecondCandidate = Math.abs(value) < 100_000_000_000 ? value * 1000 : value;\n const date = new Date(millisecondCandidate);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n if (typeof value === \"string\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n};\n\nconst toTimestampLabel = (value: unknown): string => {\n if (value === undefined || value === null || value === \"\") {\n return \"-\";\n }\n const date = toDateFromTimestamp(value);\n if (date) {\n return SYSTEM_TIME_FORMATTER.format(date);\n }\n return toDisplayValue(value);\n};\n\nconst buildSection = (title: string): string[] => [title, \"-\".repeat(title.length)];\n\nconst compactJson = (value: unknown): string => {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst extractMessageText = (message: unknown): string => {\n if (!isRecord(message)) {\n return toDisplayValue(message);\n }\n\n const content = message[\"content\"];\n if (typeof content === \"string\") {\n return content;\n }\n\n if (!Array.isArray(content)) {\n const details = message[\"details\"];\n if (isRecord(details)) {\n const stdout = details[\"stdout\"];\n if (typeof stdout === \"string\" && stdout.trim()) {\n return stdout;\n }\n }\n return \"\";\n }\n\n const parts: string[] = [];\n\n for (const block of content) {\n if (!isRecord(block)) {\n continue;\n }\n const type = block[\"type\"];\n if (type === \"text\" && typeof block[\"text\"] === \"string\" && block[\"text\"]) {\n parts.push(block[\"text\"]);\n continue;\n }\n if (type === \"toolCall\") {\n const name = typeof block[\"name\"] === \"string\" ? block[\"name\"] : \"unknown\";\n const args = block[\"arguments\"];\n let argsText = \"\";\n if (isRecord(args) && typeof args[\"script\"] === \"string\") {\n argsText = args[\"script\"];\n } else if (args !== undefined) {\n argsText = compactJson(args);\n }\n parts.push(argsText ? `[toolCall:${name}] ${argsText}` : `[toolCall:${name}]`);\n continue;\n }\n if (type === \"image\") {\n const mimeType = typeof block[\"mimeType\"] === \"string\" ? block[\"mimeType\"] : \"unknown\";\n parts.push(`[image:${mimeType}]`);\n continue;\n }\n }\n\n return parts.join(\" | \");\n};\n\nconst extractEventPayload = (payload: unknown): string => {\n if (payload === null || payload === undefined) {\n return \"\";\n }\n if (typeof payload === \"string\" || typeof payload === \"number\" || typeof payload === \"boolean\") {\n return String(payload);\n }\n if (isRecord(payload) && typeof payload[\"text\"] === \"string\") {\n return payload[\"text\"];\n }\n return compactJson(payload);\n};\n\nconst extractTraceDetails = (value: unknown): string => {\n if (!isRecord(value)) {\n return toDisplayValue(value);\n }\n\n const { type: _type, timestamp: _timestamp, ...rest } = value;\n if (Object.keys(rest).length === 0) {\n return \"-\";\n }\n return truncate(toOneLine(compactJson(rest)), 160);\n};\n\nconst buildSessionsGetTextOutput = (data: unknown): string => {\n if (!isRecord(data)) {\n return typeof data === \"string\" ? data : toPrettyJson(data);\n }\n\n const lines: string[] = [];\n\n lines.push(...buildSection(\"Session\"));\n if (data[\"id\"] !== undefined) {\n lines.push(`ID ${toDisplayValue(data[\"id\"])}`);\n }\n if (data[\"agent\"] !== undefined) {\n lines.push(`Agent ${toDisplayValue(data[\"agent\"])}`);\n }\n if (data[\"status\"] !== undefined) {\n lines.push(`Status ${toDisplayValue(data[\"status\"])}`);\n }\n if (data[\"phase\"] !== undefined) {\n lines.push(`Phase ${toDisplayValue(data[\"phase\"])}`);\n }\n if (data[\"turn\"] !== undefined) {\n lines.push(`Turn ${toDisplayValue(data[\"turn\"])}`);\n }\n if (data[\"waitingFor\"] !== undefined) {\n lines.push(\n `Waiting ${\n data[\"waitingFor\"] === null ? \"-\" : truncate(toOneLine(compactJson(data[\"waitingFor\"])))\n }`,\n );\n }\n if (data[\"steeringMode\"] !== undefined) {\n lines.push(`Steering ${toDisplayValue(data[\"steeringMode\"])}`);\n }\n if (data[\"createdAt\"] !== undefined) {\n lines.push(`Created ${toTimestampLabel(data[\"createdAt\"])}`);\n }\n if (data[\"updatedAt\"] !== undefined) {\n lines.push(`Updated ${toTimestampLabel(data[\"updatedAt\"])}`);\n }\n\n const workflow = isRecord(data[\"workflow\"]) ? data[\"workflow\"] : null;\n if (workflow?.[\"status\"] !== undefined) {\n lines.push(`Workflow ${toDisplayValue(workflow[\"status\"])}`);\n }\n\n if (\"messages\" in data) {\n const messages = Array.isArray(data[\"messages\"]) ? data[\"messages\"] : [];\n lines.push(\"\");\n lines.push(...buildSection(`Messages (${messages.length})`));\n if (messages.length === 0) {\n lines.push(\"(none)\");\n } else {\n const rows = messages.map((message, index) => {\n const record = isRecord(message) ? message : null;\n const role = typeof record?.[\"role\"] === \"string\" ? record[\"role\"] : \"unknown\";\n const timestamp = toTimestampLabel(record?.[\"timestamp\"]);\n const text = truncate(toOneLine(extractMessageText(message) || \"(no text content)\"));\n return [String(index + 1), role, timestamp, text];\n });\n lines.push(buildTableText([\"#\", \"Writer\", \"Timestamp\", \"Message\"], rows));\n }\n }\n\n if (\"events\" in data) {\n const events = Array.isArray(data[\"events\"]) ? data[\"events\"] : [];\n lines.push(\"\");\n lines.push(...buildSection(`Events (${events.length})`));\n if (events.length === 0) {\n lines.push(\"(none)\");\n } else {\n const rows = events.map((event, index) => {\n const record = isRecord(event) ? event : null;\n const type = typeof record?.[\"type\"] === \"string\" ? record[\"type\"] : \"unknown\";\n const createdAt = toTimestampLabel(record?.[\"createdAt\"] ?? record?.[\"timestamp\"]);\n const deliveredAt = toTimestampLabel(record?.[\"deliveredAt\"]);\n const consumedBy = toDisplayValue(record?.[\"consumedByStepKey\"]) || \"-\";\n const payload = truncate(toOneLine(extractEventPayload(record?.[\"payload\"]) || \"-\"), 160);\n return [String(index + 1), type, createdAt, deliveredAt, consumedBy, payload];\n });\n lines.push(\n buildTableText([\"#\", \"Type\", \"Created\", \"Delivered\", \"Consumed By\", \"Payload\"], rows),\n );\n }\n }\n\n if (\"trace\" in data) {\n const trace = Array.isArray(data[\"trace\"]) ? data[\"trace\"] : [];\n lines.push(\"\");\n lines.push(...buildSection(`Trace (${trace.length})`));\n if (trace.length === 0) {\n lines.push(\"(none)\");\n } else {\n const rows = trace.map((event, index) => {\n const record = isRecord(event) ? event : null;\n const type = typeof record?.[\"type\"] === \"string\" ? record[\"type\"] : \"unknown\";\n const timestamp = toTimestampLabel(record?.[\"timestamp\"]);\n const details = extractTraceDetails(event);\n return [String(index + 1), type, timestamp, details];\n });\n lines.push(buildTableText([\"#\", \"Type\", \"Timestamp\", \"Details\"], rows));\n }\n }\n\n if (\"summaries\" in data) {\n const summaries = Array.isArray(data[\"summaries\"]) ? data[\"summaries\"] : [];\n lines.push(\"\");\n lines.push(...buildSection(`Summaries (${summaries.length})`));\n if (summaries.length === 0) {\n lines.push(\"(none)\");\n } else {\n const rows = summaries.map((entry) => {\n const record = isRecord(entry) ? entry : null;\n const turn = toDisplayValue(record?.[\"turn\"]);\n const summary =\n typeof record?.[\"summary\"] === \"string\" && record[\"summary\"].trim()\n ? record[\"summary\"]\n : extractMessageText(record?.[\"assistant\"]);\n return [turn || \"-\", truncate(toOneLine(summary || \"-\"), 160)];\n });\n lines.push(buildTableText([\"Turn\", \"Summary\"], rows));\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nconst buildSessionsGetOutput = (data: unknown, json: boolean): CliActionResult => {\n if (json) {\n return { output: { format: \"json\", data } };\n }\n return { output: { format: \"text\", text: buildSessionsGetTextOutput(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 outputData =\n args.statusOnly && response.data && typeof response.data === \"object\"\n ? {\n status: (response.data as Record<string, unknown>)[\"status\"],\n workflow: (response.data as Record<string, unknown>)[\"workflow\"],\n phase: (response.data as Record<string, unknown>)[\"phase\"],\n turn: (response.data as Record<string, unknown>)[\"turn\"],\n waitingFor: (response.data as Record<string, unknown>)[\"waitingFor\"],\n }\n : response.data;\n return buildSessionsGetOutput(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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"}
|