@elizaos/plugin-trajectory-logger 2.0.3-beta.6 → 2.0.3-beta.7

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 (67) hide show
  1. package/dist/api-client.d.ts +88 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +68 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/components/PhaseChip.d.ts +13 -0
  6. package/dist/components/PhaseChip.d.ts.map +1 -0
  7. package/dist/components/PhaseChip.js +100 -0
  8. package/dist/components/PhaseChip.js.map +1 -0
  9. package/dist/components/PhaseDrilldown.d.ts +5 -0
  10. package/dist/components/PhaseDrilldown.d.ts.map +1 -0
  11. package/dist/components/PhaseDrilldown.js +118 -0
  12. package/dist/components/PhaseDrilldown.js.map +1 -0
  13. package/dist/components/TrajectoryLoggerAppView.d.ts +14 -0
  14. package/dist/components/TrajectoryLoggerAppView.d.ts.map +1 -0
  15. package/dist/components/TrajectoryLoggerAppView.js +184 -0
  16. package/dist/components/TrajectoryLoggerAppView.js.map +1 -0
  17. package/dist/components/TrajectoryLoggerSpatialView.d.ts +53 -0
  18. package/dist/components/TrajectoryLoggerSpatialView.d.ts.map +1 -0
  19. package/dist/components/TrajectoryLoggerSpatialView.js +293 -0
  20. package/dist/components/TrajectoryLoggerSpatialView.js.map +1 -0
  21. package/dist/components/TrajectoryLoggerView.d.ts +23 -0
  22. package/dist/components/TrajectoryLoggerView.d.ts.map +1 -0
  23. package/dist/components/TrajectoryLoggerView.interact.d.ts +2 -0
  24. package/dist/components/TrajectoryLoggerView.interact.d.ts.map +1 -0
  25. package/dist/components/TrajectoryLoggerView.interact.js +35 -0
  26. package/dist/components/TrajectoryLoggerView.interact.js.map +1 -0
  27. package/dist/components/TrajectoryLoggerView.js +64 -0
  28. package/dist/components/TrajectoryLoggerView.js.map +1 -0
  29. package/dist/components/trajectory-logger-app.d.ts +8 -0
  30. package/dist/components/trajectory-logger-app.d.ts.map +1 -0
  31. package/dist/components/trajectory-logger-app.js +24 -0
  32. package/dist/components/trajectory-logger-app.js.map +1 -0
  33. package/dist/components/trajectory-logger-view-bundle.d.ts +3 -0
  34. package/dist/components/trajectory-logger-view-bundle.d.ts.map +1 -0
  35. package/dist/components/trajectory-logger-view-bundle.js +7 -0
  36. package/dist/components/trajectory-logger-view-bundle.js.map +1 -0
  37. package/dist/index.d.ts +16 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +22 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/phases.d.ts +21 -0
  42. package/dist/phases.d.ts.map +1 -0
  43. package/dist/phases.js +154 -0
  44. package/dist/phases.js.map +1 -0
  45. package/dist/plugin.d.ts +14 -0
  46. package/dist/plugin.d.ts.map +1 -0
  47. package/dist/plugin.js +51 -0
  48. package/dist/plugin.js.map +1 -0
  49. package/dist/register-terminal-view.d.ts +16 -0
  50. package/dist/register-terminal-view.d.ts.map +1 -0
  51. package/dist/register-terminal-view.js +21 -0
  52. package/dist/register-terminal-view.js.map +1 -0
  53. package/dist/register.d.ts +7 -0
  54. package/dist/register.d.ts.map +1 -0
  55. package/dist/register.js +18 -0
  56. package/dist/register.js.map +1 -0
  57. package/dist/ui.d.ts +4 -0
  58. package/dist/ui.d.ts.map +1 -0
  59. package/dist/ui.js +15 -0
  60. package/dist/ui.js.map +1 -0
  61. package/dist/usePollingTrajectories.d.ts +18 -0
  62. package/dist/usePollingTrajectories.d.ts.map +1 -0
  63. package/dist/usePollingTrajectories.js +87 -0
  64. package/dist/usePollingTrajectories.js.map +1 -0
  65. package/dist/views/bundle.js +646 -0
  66. package/dist/views/bundle.js.map +1 -0
  67. package/package.json +5 -5
@@ -0,0 +1,88 @@
1
+ export interface TrajectoryListItem {
2
+ id: string;
3
+ status: "active" | "completed" | "error";
4
+ llmCallCount: number;
5
+ }
6
+ export interface TrajectoryListResult {
7
+ trajectories: TrajectoryListItem[];
8
+ total: number;
9
+ }
10
+ export interface UILlmCall {
11
+ id: string;
12
+ model: string;
13
+ response: string;
14
+ purpose: string;
15
+ actionType: string;
16
+ stepType: string;
17
+ }
18
+ export interface UIProviderAccess {
19
+ id: string;
20
+ providerName: string;
21
+ purpose: string;
22
+ }
23
+ export interface UIToolEvent {
24
+ id: string;
25
+ type: "tool_call" | "tool_result" | "tool_error";
26
+ actionName?: string;
27
+ toolName?: string;
28
+ name?: string;
29
+ args?: Record<string, unknown>;
30
+ input?: Record<string, unknown>;
31
+ result?: unknown;
32
+ output?: unknown;
33
+ status?: "queued" | "running" | "completed" | "skipped" | "failed";
34
+ success?: boolean;
35
+ durationMs?: number;
36
+ error?: string;
37
+ }
38
+ export interface UIEvaluationEvent {
39
+ id: string;
40
+ evaluatorName?: string;
41
+ name?: string;
42
+ status?: "queued" | "running" | "completed" | "skipped" | "failed";
43
+ success?: boolean;
44
+ decision?: string;
45
+ thought?: string;
46
+ error?: string;
47
+ }
48
+ export interface TrajectoryDetail {
49
+ trajectory: TrajectoryListItem;
50
+ llmCalls: UILlmCall[];
51
+ providerAccesses: UIProviderAccess[];
52
+ toolEvents?: UIToolEvent[];
53
+ evaluationEvents?: UIEvaluationEvent[];
54
+ }
55
+ /**
56
+ * HTTP error from a trajectory route, carrying the response status so callers
57
+ * can distinguish a "service not mounted" surface (404/503 — the training
58
+ * plugin that serves `/api/trajectories*` is absent) from a genuine failure.
59
+ */
60
+ export declare class TrajectoryHttpError extends Error {
61
+ readonly status: number;
62
+ constructor(status: number, statusText: string, body: string);
63
+ /**
64
+ * True when the status means the trajectory routes are not available on this
65
+ * surface (the provider plugin is not loaded) rather than a request failure.
66
+ */
67
+ get isUnavailable(): boolean;
68
+ }
69
+ export declare function fetchTrajectoryList(options?: {
70
+ limit?: number;
71
+ signal?: AbortSignal;
72
+ }): Promise<TrajectoryListResult>;
73
+ export declare function fetchTrajectoryDetail(id: string, options?: {
74
+ signal?: AbortSignal;
75
+ }): Promise<TrajectoryDetail>;
76
+ /**
77
+ * Soft-purge a single trajectory. The server route is wired by the training
78
+ * plugin; if it returns 404 the caller surfaces "not available" rather than
79
+ * silently failing.
80
+ */
81
+ export declare function purgeTrajectory(id: string): Promise<void>;
82
+ /**
83
+ * Export a trajectory as a signed zip bundle. The server route returns the
84
+ * archive as `application/zip` (with a `X-Eliza-Signature` header carrying the
85
+ * detached signature). Caller is responsible for streaming the blob.
86
+ */
87
+ export declare function fetchTrajectoryExport(id: string): Promise<Blob>;
88
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ class TrajectoryHttpError extends Error {
2
+ status;
3
+ constructor(status, statusText, body) {
4
+ super(
5
+ `[trajectory-logger] ${status} ${statusText}${body ? `: ${body.slice(0, 200)}` : ""}`
6
+ );
7
+ this.name = "TrajectoryHttpError";
8
+ this.status = status;
9
+ }
10
+ /**
11
+ * True when the status means the trajectory routes are not available on this
12
+ * surface (the provider plugin is not loaded) rather than a request failure.
13
+ */
14
+ get isUnavailable() {
15
+ return this.status === 404 || this.status === 503;
16
+ }
17
+ }
18
+ async function readJson(res) {
19
+ if (!res.ok) {
20
+ const body = await res.text().catch(() => "");
21
+ throw new TrajectoryHttpError(res.status, res.statusText, body);
22
+ }
23
+ return await res.json();
24
+ }
25
+ async function fetchTrajectoryList(options = {}) {
26
+ const limit = options.limit ?? 10;
27
+ const res = await fetch(`/api/trajectories?limit=${limit}`, {
28
+ headers: { Accept: "application/json" },
29
+ signal: options.signal
30
+ });
31
+ return readJson(res);
32
+ }
33
+ async function fetchTrajectoryDetail(id, options = {}) {
34
+ const res = await fetch(`/api/trajectories/${encodeURIComponent(id)}`, {
35
+ headers: { Accept: "application/json" },
36
+ signal: options.signal
37
+ });
38
+ return readJson(res);
39
+ }
40
+ async function purgeTrajectory(id) {
41
+ const res = await fetch(`/api/trajectories/${encodeURIComponent(id)}`, {
42
+ method: "DELETE",
43
+ headers: { Accept: "application/json" }
44
+ });
45
+ if (!res.ok) {
46
+ throw new Error(`purgeTrajectory failed: ${res.status} ${res.statusText}`);
47
+ }
48
+ }
49
+ async function fetchTrajectoryExport(id) {
50
+ const res = await fetch(
51
+ `/api/trajectories/${encodeURIComponent(id)}/export`,
52
+ { headers: { Accept: "application/zip" } }
53
+ );
54
+ if (!res.ok) {
55
+ throw new Error(
56
+ `fetchTrajectoryExport failed: ${res.status} ${res.statusText}`
57
+ );
58
+ }
59
+ return res.blob();
60
+ }
61
+ export {
62
+ TrajectoryHttpError,
63
+ fetchTrajectoryDetail,
64
+ fetchTrajectoryExport,
65
+ fetchTrajectoryList,
66
+ purgeTrajectory
67
+ };
68
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api-client.ts"],"sourcesContent":["// Wire shapes for /api/trajectories[?/...] (served by @elizaos/plugin-training).\n// Only the fields the widget reads are typed — extra fields the route returns\n// are tolerated, just untyped.\n\nexport interface TrajectoryListItem {\n id: string;\n status: \"active\" | \"completed\" | \"error\";\n llmCallCount: number;\n}\n\nexport interface TrajectoryListResult {\n trajectories: TrajectoryListItem[];\n total: number;\n}\n\nexport interface UILlmCall {\n id: string;\n model: string;\n response: string;\n purpose: string;\n actionType: string;\n stepType: string;\n}\n\nexport interface UIProviderAccess {\n id: string;\n providerName: string;\n purpose: string;\n}\n\nexport interface UIToolEvent {\n id: string;\n type: \"tool_call\" | \"tool_result\" | \"tool_error\";\n actionName?: string;\n toolName?: string;\n name?: string;\n args?: Record<string, unknown>;\n input?: Record<string, unknown>;\n result?: unknown;\n output?: unknown;\n status?: \"queued\" | \"running\" | \"completed\" | \"skipped\" | \"failed\";\n success?: boolean;\n durationMs?: number;\n error?: string;\n}\n\nexport interface UIEvaluationEvent {\n id: string;\n evaluatorName?: string;\n name?: string;\n status?: \"queued\" | \"running\" | \"completed\" | \"skipped\" | \"failed\";\n success?: boolean;\n decision?: string;\n thought?: string;\n error?: string;\n}\n\nexport interface TrajectoryDetail {\n trajectory: TrajectoryListItem;\n llmCalls: UILlmCall[];\n providerAccesses: UIProviderAccess[];\n toolEvents?: UIToolEvent[];\n evaluationEvents?: UIEvaluationEvent[];\n}\n\n/**\n * HTTP error from a trajectory route, carrying the response status so callers\n * can distinguish a \"service not mounted\" surface (404/503 — the training\n * plugin that serves `/api/trajectories*` is absent) from a genuine failure.\n */\nexport class TrajectoryHttpError extends Error {\n readonly status: number;\n\n constructor(status: number, statusText: string, body: string) {\n super(\n `[trajectory-logger] ${status} ${statusText}${body ? `: ${body.slice(0, 200)}` : \"\"}`,\n );\n this.name = \"TrajectoryHttpError\";\n this.status = status;\n }\n\n /**\n * True when the status means the trajectory routes are not available on this\n * surface (the provider plugin is not loaded) rather than a request failure.\n */\n get isUnavailable(): boolean {\n return this.status === 404 || this.status === 503;\n }\n}\n\nasync function readJson<T>(res: Response): Promise<T> {\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new TrajectoryHttpError(res.status, res.statusText, body);\n }\n return (await res.json()) as T;\n}\n\nexport async function fetchTrajectoryList(\n options: { limit?: number; signal?: AbortSignal } = {},\n): Promise<TrajectoryListResult> {\n const limit = options.limit ?? 10;\n const res = await fetch(`/api/trajectories?limit=${limit}`, {\n headers: { Accept: \"application/json\" },\n signal: options.signal,\n });\n return readJson<TrajectoryListResult>(res);\n}\n\nexport async function fetchTrajectoryDetail(\n id: string,\n options: { signal?: AbortSignal } = {},\n): Promise<TrajectoryDetail> {\n const res = await fetch(`/api/trajectories/${encodeURIComponent(id)}`, {\n headers: { Accept: \"application/json\" },\n signal: options.signal,\n });\n return readJson<TrajectoryDetail>(res);\n}\n\n/**\n * Soft-purge a single trajectory. The server route is wired by the training\n * plugin; if it returns 404 the caller surfaces \"not available\" rather than\n * silently failing.\n */\nexport async function purgeTrajectory(id: string): Promise<void> {\n const res = await fetch(`/api/trajectories/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new Error(`purgeTrajectory failed: ${res.status} ${res.statusText}`);\n }\n}\n\n/**\n * Export a trajectory as a signed zip bundle. The server route returns the\n * archive as `application/zip` (with a `X-Eliza-Signature` header carrying the\n * detached signature). Caller is responsible for streaming the blob.\n */\nexport async function fetchTrajectoryExport(id: string): Promise<Blob> {\n const res = await fetch(\n `/api/trajectories/${encodeURIComponent(id)}/export`,\n { headers: { Accept: \"application/zip\" } },\n );\n if (!res.ok) {\n throw new Error(\n `fetchTrajectoryExport failed: ${res.status} ${res.statusText}`,\n );\n }\n return res.blob();\n}\n"],"mappings":"AAsEO,MAAM,4BAA4B,MAAM;AAAA,EACpC;AAAA,EAET,YAAY,QAAgB,YAAoB,MAAc;AAC5D;AAAA,MACE,uBAAuB,MAAM,IAAI,UAAU,GAAG,OAAO,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IACrF;AACA,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBAAyB;AAC3B,WAAO,KAAK,WAAW,OAAO,KAAK,WAAW;AAAA,EAChD;AACF;AAEA,eAAe,SAAY,KAA2B;AACpD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,oBAAoB,IAAI,QAAQ,IAAI,YAAY,IAAI;AAAA,EAChE;AACA,SAAQ,MAAM,IAAI,KAAK;AACzB;AAEA,eAAsB,oBACpB,UAAoD,CAAC,GACtB;AAC/B,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,MAAM,MAAM,MAAM,2BAA2B,KAAK,IAAI;AAAA,IAC1D,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACtC,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,SAAO,SAA+B,GAAG;AAC3C;AAEA,eAAsB,sBACpB,IACA,UAAoC,CAAC,GACV;AAC3B,QAAM,MAAM,MAAM,MAAM,qBAAqB,mBAAmB,EAAE,CAAC,IAAI;AAAA,IACrE,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACtC,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,SAAO,SAA2B,GAAG;AACvC;AAOA,eAAsB,gBAAgB,IAA2B;AAC/D,QAAM,MAAM,MAAM,MAAM,qBAAqB,mBAAmB,EAAE,CAAC,IAAI;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS,EAAE,QAAQ,mBAAmB;AAAA,EACxC,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,2BAA2B,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,EAC3E;AACF;AAOA,eAAsB,sBAAsB,IAA2B;AACrE,QAAM,MAAM,MAAM;AAAA,IAChB,qBAAqB,mBAAmB,EAAE,CAAC;AAAA,IAC3C,EAAE,SAAS,EAAE,QAAQ,kBAAkB,EAAE;AAAA,EAC3C;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI;AAAA,MACR,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,IAAI,KAAK;AAClB;","names":[]}
@@ -0,0 +1,13 @@
1
+ import type { PhaseName, PhaseStatus } from "../phases";
2
+ import type { Slot } from "./TrajectoryLoggerAppView";
3
+ interface PhaseChipProps {
4
+ slot: Slot;
5
+ phase: PhaseName;
6
+ status: PhaseStatus;
7
+ summary: string | null;
8
+ selected: boolean;
9
+ onClick: () => void;
10
+ }
11
+ export declare function PhaseChip({ slot, phase, status, summary, selected, onClick, }: PhaseChipProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=PhaseChip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseChip.d.ts","sourceRoot":"","sources":["../../src/components/PhaseChip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEtD,UAAU,cAAc;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA0CD,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,GACR,EAAE,cAAc,2CAoDhB"}
@@ -0,0 +1,100 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useAgentElement } from "@elizaos/ui/agent-surface";
3
+ import { Brain, CheckSquare, Inbox, Zap } from "lucide-react";
4
+ const ICON = {
5
+ HANDLE: Inbox,
6
+ PLAN: Brain,
7
+ ACTION: Zap,
8
+ EVALUATE: CheckSquare
9
+ };
10
+ const MEDALLION = {
11
+ idle: {
12
+ ring: "",
13
+ icon: "text-muted/70",
14
+ label: "text-muted/70"
15
+ },
16
+ active: {
17
+ ring: "bg-accent/15 shadow-[0_0_0_3px_var(--accent-subtle,rgba(255,88,0,0.14))]",
18
+ icon: "text-accent",
19
+ label: "text-accent"
20
+ },
21
+ done: {
22
+ ring: "bg-ok/12",
23
+ icon: "text-ok",
24
+ label: "text-txt"
25
+ },
26
+ skipped: {
27
+ ring: "bg-warn/10",
28
+ icon: "text-warn",
29
+ label: "text-muted"
30
+ },
31
+ error: {
32
+ ring: "bg-danger/12",
33
+ icon: "text-danger",
34
+ label: "text-danger"
35
+ }
36
+ };
37
+ function PhaseChip({
38
+ slot,
39
+ phase,
40
+ status,
41
+ summary,
42
+ selected,
43
+ onClick
44
+ }) {
45
+ const Icon = ICON[phase];
46
+ const tone = MEDALLION[status];
47
+ const slotLabel = slot === "now" ? "current turn" : "last turn";
48
+ const { ref, agentProps } = useAgentElement({
49
+ id: `phase-${slot}-${phase.toLowerCase()}`,
50
+ role: "tab",
51
+ label: `${phase} (${slotLabel})`,
52
+ group: slot === "now" ? "phases-now" : "phases-last",
53
+ status: selected ? "active" : "inactive",
54
+ description: `Inspect the ${phase} phase of the ${slotLabel}`
55
+ });
56
+ return /* @__PURE__ */ jsxs(
57
+ "button",
58
+ {
59
+ ref,
60
+ type: "button",
61
+ onClick,
62
+ title: summary ? `${phase} \u2014 ${summary}` : phase,
63
+ "aria-current": selected ? "true" : void 0,
64
+ ...agentProps,
65
+ className: [
66
+ "group flex min-w-0 flex-col items-center gap-1 px-1 py-1.5 text-center transition-colors",
67
+ selected ? "text-accent" : "hover:text-txt"
68
+ ].join(" "),
69
+ children: [
70
+ /* @__PURE__ */ jsx(
71
+ "span",
72
+ {
73
+ className: [
74
+ "relative grid h-9 w-9 place-items-center rounded-full transition-all",
75
+ tone.ring,
76
+ status === "active" ? "animate-pulse" : ""
77
+ ].join(" "),
78
+ "aria-hidden": true,
79
+ children: /* @__PURE__ */ jsx(Icon, { className: ["h-4 w-4", tone.icon].join(" ") })
80
+ }
81
+ ),
82
+ /* @__PURE__ */ jsx(
83
+ "span",
84
+ {
85
+ className: [
86
+ "text-2xs font-semibold uppercase tracking-wider",
87
+ tone.label
88
+ ].join(" "),
89
+ children: phase
90
+ }
91
+ ),
92
+ summary ? /* @__PURE__ */ jsx("span", { className: "sr-only w-full truncate text-2xs text-muted", children: summary }) : /* @__PURE__ */ jsx("span", { className: "h-1 w-1 rounded-full bg-muted/30", "aria-hidden": true })
93
+ ]
94
+ }
95
+ );
96
+ }
97
+ export {
98
+ PhaseChip
99
+ };
100
+ //# sourceMappingURL=PhaseChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/PhaseChip.tsx"],"sourcesContent":["import { useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport { Brain, CheckSquare, Inbox, Zap } from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport type { PhaseName, PhaseStatus } from \"../phases.js\";\nimport type { Slot } from \"./TrajectoryLoggerAppView.js\";\n\ninterface PhaseChipProps {\n slot: Slot;\n phase: PhaseName;\n status: PhaseStatus;\n summary: string | null;\n selected: boolean;\n onClick: () => void;\n}\n\nconst ICON: Record<PhaseName, ComponentType<{ className?: string }>> = {\n HANDLE: Inbox,\n PLAN: Brain,\n ACTION: Zap,\n EVALUATE: CheckSquare,\n};\n\n// Medallion ring + glow per status. Idle is dim-but-legible; active is\n// accent-lit and pulses; terminal states carry their own semantic tone.\nconst MEDALLION: Record<\n PhaseStatus,\n { ring: string; icon: string; label: string }\n> = {\n idle: {\n ring: \"\",\n icon: \"text-muted/70\",\n label: \"text-muted/70\",\n },\n active: {\n ring: \"bg-accent/15 shadow-[0_0_0_3px_var(--accent-subtle,rgba(255,88,0,0.14))]\",\n icon: \"text-accent\",\n label: \"text-accent\",\n },\n done: {\n ring: \"bg-ok/12\",\n icon: \"text-ok\",\n label: \"text-txt\",\n },\n skipped: {\n ring: \"bg-warn/10\",\n icon: \"text-warn\",\n label: \"text-muted\",\n },\n error: {\n ring: \"bg-danger/12\",\n icon: \"text-danger\",\n label: \"text-danger\",\n },\n};\n\nexport function PhaseChip({\n slot,\n phase,\n status,\n summary,\n selected,\n onClick,\n}: PhaseChipProps) {\n const Icon = ICON[phase];\n const tone = MEDALLION[status];\n const slotLabel = slot === \"now\" ? \"current turn\" : \"last turn\";\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: `phase-${slot}-${phase.toLowerCase()}`,\n role: \"tab\",\n label: `${phase} (${slotLabel})`,\n group: slot === \"now\" ? \"phases-now\" : \"phases-last\",\n status: selected ? \"active\" : \"inactive\",\n description: `Inspect the ${phase} phase of the ${slotLabel}`,\n });\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={onClick}\n title={summary ? `${phase} — ${summary}` : phase}\n aria-current={selected ? \"true\" : undefined}\n {...agentProps}\n className={[\n \"group flex min-w-0 flex-col items-center gap-1 px-1 py-1.5 text-center transition-colors\",\n selected ? \"text-accent\" : \"hover:text-txt\",\n ].join(\" \")}\n >\n <span\n className={[\n \"relative grid h-9 w-9 place-items-center rounded-full transition-all\",\n tone.ring,\n status === \"active\" ? \"animate-pulse\" : \"\",\n ].join(\" \")}\n aria-hidden\n >\n <Icon className={[\"h-4 w-4\", tone.icon].join(\" \")} />\n </span>\n <span\n className={[\n \"text-2xs font-semibold uppercase tracking-wider\",\n tone.label,\n ].join(\" \")}\n >\n {phase}\n </span>\n {summary ? (\n <span className=\"sr-only w-full truncate text-2xs text-muted\">\n {summary}\n </span>\n ) : (\n <span className=\"h-1 w-1 rounded-full bg-muted/30\" aria-hidden />\n )}\n </button>\n );\n}\n"],"mappings":"AA2EI,SAoBI,KApBJ;AA3EJ,SAAS,uBAAuB;AAChC,SAAS,OAAO,aAAa,OAAO,WAAW;AAc/C,MAAM,OAAiE;AAAA,EACrE,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AACZ;AAIA,MAAM,YAGF;AAAA,EACF,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,OAAO,KAAK,KAAK;AACvB,QAAM,OAAO,UAAU,MAAM;AAC7B,QAAM,YAAY,SAAS,QAAQ,iBAAiB;AACpD,QAAM,EAAE,KAAK,WAAW,IAAI,gBAAmC;AAAA,IAC7D,IAAI,SAAS,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,IACxC,MAAM;AAAA,IACN,OAAO,GAAG,KAAK,KAAK,SAAS;AAAA,IAC7B,OAAO,SAAS,QAAQ,eAAe;AAAA,IACvC,QAAQ,WAAW,WAAW;AAAA,IAC9B,aAAa,eAAe,KAAK,iBAAiB,SAAS;AAAA,EAC7D,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL;AAAA,MACA,OAAO,UAAU,GAAG,KAAK,WAAM,OAAO,KAAK;AAAA,MAC3C,gBAAc,WAAW,SAAS;AAAA,MACjC,GAAG;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACA,WAAW,gBAAgB;AAAA,MAC7B,EAAE,KAAK,GAAG;AAAA,MAEV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,KAAK;AAAA,cACL,WAAW,WAAW,kBAAkB;AAAA,YAC1C,EAAE,KAAK,GAAG;AAAA,YACV,eAAW;AAAA,YAEX,8BAAC,QAAK,WAAW,CAAC,WAAW,KAAK,IAAI,EAAE,KAAK,GAAG,GAAG;AAAA;AAAA,QACrD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,KAAK;AAAA,YACP,EAAE,KAAK,GAAG;AAAA,YAET;AAAA;AAAA,QACH;AAAA,QACC,UACC,oBAAC,UAAK,WAAU,+CACb,mBACH,IAEA,oBAAC,UAAK,WAAU,oCAAmC,eAAW,MAAC;AAAA;AAAA;AAAA,EAEnE;AAEJ;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { type PhaseSummary } from "../phases";
2
+ export declare function PhaseDrilldown({ phase }: {
3
+ phase: PhaseSummary;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=PhaseDrilldown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseDrilldown.d.ts","sourceRoot":"","sources":["../../src/components/PhaseDrilldown.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5E,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,2CAahE"}
@@ -0,0 +1,118 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { extractShouldRespondDecision } from "../phases.js";
3
+ function PhaseDrilldown({ phase }) {
4
+ switch (phase.phase) {
5
+ case "HANDLE":
6
+ return /* @__PURE__ */ jsx(HandleBody, { calls: phase.llmCalls, ctx: phase.providerAccesses });
7
+ case "PLAN":
8
+ return /* @__PURE__ */ jsx(PlanBody, { calls: phase.llmCalls });
9
+ case "ACTION":
10
+ return /* @__PURE__ */ jsx(ActionBody, { events: phase.toolEvents });
11
+ case "EVALUATE":
12
+ return /* @__PURE__ */ jsx(EvaluateBody, { calls: phase.llmCalls, events: phase.evaluationEvents });
13
+ }
14
+ }
15
+ const STATUS_BORDER = {
16
+ ok: "text-green-500",
17
+ error: "text-red-500",
18
+ running: "text-blue-500 animate-pulse",
19
+ skipped: "text-yellow-500"
20
+ };
21
+ function jsonBlock(value) {
22
+ try {
23
+ return JSON.stringify(value, null, 2);
24
+ } catch {
25
+ return String(value);
26
+ }
27
+ }
28
+ function previewText(text) {
29
+ if (text.length <= 600) return text;
30
+ return `${text.slice(0, 600)}\u2026 (+${text.length - 600})`;
31
+ }
32
+ function HandleBody({
33
+ calls,
34
+ ctx
35
+ }) {
36
+ const respond = calls.find(
37
+ (c) => (c.stepType || c.purpose || "").toLowerCase() === "should_respond"
38
+ );
39
+ const decision = respond ? extractShouldRespondDecision(respond) : null;
40
+ const providers = [
41
+ ...new Set(ctx.map((p) => p.providerName).filter(Boolean))
42
+ ];
43
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 text-xs", children: [
44
+ decision ? /* @__PURE__ */ jsxs("div", { children: [
45
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-txt", children: decision.decision }),
46
+ decision.reasoning ? /* @__PURE__ */ jsx("span", { className: "ml-2 text-muted", children: decision.reasoning }) : null
47
+ ] }) : null,
48
+ providers.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: providers.map((n) => /* @__PURE__ */ jsx("span", { className: "px-1 py-0.5 text-2xs text-txt", children: n }, n)) }) : null
49
+ ] });
50
+ }
51
+ function PlanBody({ calls }) {
52
+ const last = calls[calls.length - 1];
53
+ if (!last) return null;
54
+ const text = previewText(last.response.trim());
55
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 text-xs", children: [
56
+ last.actionType ? /* @__PURE__ */ jsx("div", { className: "font-mono text-txt", children: last.actionType }) : null,
57
+ text ? /* @__PURE__ */ jsx("pre", { className: "max-h-48 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted", children: text }) : null
58
+ ] });
59
+ }
60
+ function ActionBody({ events }) {
61
+ if (events.length === 0) return null;
62
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 text-xs", children: events.map((e) => {
63
+ const name = e.actionName || e.toolName || e.name || "action";
64
+ const status = e.type === "tool_error" || e.error || e.success === false ? "error" : e.type === "tool_result" || e.status === "completed" || e.success === true ? "ok" : e.status === "skipped" ? "skipped" : "running";
65
+ const args = e.args ?? e.input ?? null;
66
+ const result = e.result ?? e.output ?? null;
67
+ return /* @__PURE__ */ jsxs(
68
+ "div",
69
+ {
70
+ "data-phase-status": status,
71
+ className: ["p-1.5", STATUS_BORDER[status]].join(" "),
72
+ children: [
73
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
74
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-txt", children: name }),
75
+ typeof e.durationMs === "number" ? /* @__PURE__ */ jsxs("span", { className: "text-2xs text-muted/60", children: [
76
+ e.durationMs,
77
+ "ms"
78
+ ] }) : null
79
+ ] }),
80
+ e.error ? /* @__PURE__ */ jsx("div", { className: "mt-1 text-2xs text-red-400", children: e.error }) : null,
81
+ args && Object.keys(args).length > 0 ? /* @__PURE__ */ jsx("pre", { className: "mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted", children: jsonBlock(args) }) : null,
82
+ result !== null && result !== void 0 ? /* @__PURE__ */ jsx("pre", { className: "mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted", children: jsonBlock(result) }) : null
83
+ ]
84
+ },
85
+ e.id
86
+ );
87
+ }) });
88
+ }
89
+ function EvaluateBody({
90
+ calls,
91
+ events
92
+ }) {
93
+ if (events.length === 0 && calls.length === 0) return null;
94
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2 text-xs", children: events.map((e) => {
95
+ const name = e.evaluatorName || e.name || "evaluator";
96
+ const status = e.error || e.success === false ? "error" : e.success === true || e.status === "completed" ? "ok" : e.status === "skipped" ? "skipped" : "running";
97
+ return /* @__PURE__ */ jsxs(
98
+ "div",
99
+ {
100
+ "data-phase-status": status,
101
+ className: ["p-1.5", STATUS_BORDER[status]].join(" "),
102
+ children: [
103
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
104
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-txt", children: name }),
105
+ e.decision ? /* @__PURE__ */ jsx("span", { className: "text-2xs text-muted", children: e.decision }) : null
106
+ ] }),
107
+ e.thought ? /* @__PURE__ */ jsx("div", { className: "mt-1 text-muted", children: e.thought }) : null,
108
+ e.error ? /* @__PURE__ */ jsx("div", { className: "mt-1 text-2xs text-red-400", children: e.error }) : null
109
+ ]
110
+ },
111
+ e.id
112
+ );
113
+ }) });
114
+ }
115
+ export {
116
+ PhaseDrilldown
117
+ };
118
+ //# sourceMappingURL=PhaseDrilldown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/PhaseDrilldown.tsx"],"sourcesContent":["import type {\n UIEvaluationEvent,\n UILlmCall,\n UIProviderAccess,\n UIToolEvent,\n} from \"../api-client.js\";\nimport { extractShouldRespondDecision, type PhaseSummary } from \"../phases.js\";\n\nexport function PhaseDrilldown({ phase }: { phase: PhaseSummary }) {\n switch (phase.phase) {\n case \"HANDLE\":\n return <HandleBody calls={phase.llmCalls} ctx={phase.providerAccesses} />;\n case \"PLAN\":\n return <PlanBody calls={phase.llmCalls} />;\n case \"ACTION\":\n return <ActionBody events={phase.toolEvents} />;\n case \"EVALUATE\":\n return (\n <EvaluateBody calls={phase.llmCalls} events={phase.evaluationEvents} />\n );\n }\n}\n\nconst STATUS_BORDER: Record<\"ok\" | \"error\" | \"running\" | \"skipped\", string> = {\n ok: \"text-green-500\",\n error: \"text-red-500\",\n running: \"text-blue-500 animate-pulse\",\n skipped: \"text-yellow-500\",\n};\n\nfunction jsonBlock(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction previewText(text: string): string {\n if (text.length <= 600) return text;\n return `${text.slice(0, 600)}… (+${text.length - 600})`;\n}\n\nfunction HandleBody({\n calls,\n ctx,\n}: {\n calls: UILlmCall[];\n ctx: UIProviderAccess[];\n}) {\n const respond = calls.find(\n (c) => (c.stepType || c.purpose || \"\").toLowerCase() === \"should_respond\",\n );\n const decision = respond ? extractShouldRespondDecision(respond) : null;\n const providers = [\n ...new Set(ctx.map((p) => p.providerName).filter(Boolean)),\n ];\n return (\n <div className=\"flex flex-col gap-2 text-xs\">\n {decision ? (\n <div>\n <span className=\"font-semibold text-txt\">{decision.decision}</span>\n {decision.reasoning ? (\n <span className=\"ml-2 text-muted\">{decision.reasoning}</span>\n ) : null}\n </div>\n ) : null}\n {providers.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {providers.map((n) => (\n <span key={n} className=\"px-1 py-0.5 text-2xs text-txt\">\n {n}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PlanBody({ calls }: { calls: UILlmCall[] }) {\n const last = calls[calls.length - 1];\n if (!last) return null;\n const text = previewText(last.response.trim());\n return (\n <div className=\"flex flex-col gap-2 text-xs\">\n {last.actionType ? (\n <div className=\"font-mono text-txt\">{last.actionType}</div>\n ) : null}\n {text ? (\n <pre className=\"max-h-48 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted\">\n {text}\n </pre>\n ) : null}\n </div>\n );\n}\n\nfunction ActionBody({ events }: { events: UIToolEvent[] }) {\n if (events.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-2 text-xs\">\n {events.map((e) => {\n const name = e.actionName || e.toolName || e.name || \"action\";\n const status: keyof typeof STATUS_BORDER =\n e.type === \"tool_error\" || e.error || e.success === false\n ? \"error\"\n : e.type === \"tool_result\" ||\n e.status === \"completed\" ||\n e.success === true\n ? \"ok\"\n : e.status === \"skipped\"\n ? \"skipped\"\n : \"running\";\n const args = e.args ?? e.input ?? null;\n const result = e.result ?? e.output ?? null;\n return (\n <div\n key={e.id}\n data-phase-status={status}\n className={[\"p-1.5\", STATUS_BORDER[status]].join(\" \")}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"font-mono text-txt\">{name}</span>\n {typeof e.durationMs === \"number\" ? (\n <span className=\"text-2xs text-muted/60\">{e.durationMs}ms</span>\n ) : null}\n </div>\n {e.error ? (\n <div className=\"mt-1 text-2xs text-red-400\">{e.error}</div>\n ) : null}\n {args && Object.keys(args).length > 0 ? (\n <pre className=\"mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted\">\n {jsonBlock(args)}\n </pre>\n ) : null}\n {result !== null && result !== undefined ? (\n <pre className=\"mt-1 max-h-32 overflow-y-auto whitespace-pre-wrap break-words bg-transparent p-1 text-2xs text-muted\">\n {jsonBlock(result)}\n </pre>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction EvaluateBody({\n calls,\n events,\n}: {\n calls: UILlmCall[];\n events: UIEvaluationEvent[];\n}) {\n if (events.length === 0 && calls.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-2 text-xs\">\n {events.map((e) => {\n const name = e.evaluatorName || e.name || \"evaluator\";\n const status: keyof typeof STATUS_BORDER =\n e.error || e.success === false\n ? \"error\"\n : e.success === true || e.status === \"completed\"\n ? \"ok\"\n : e.status === \"skipped\"\n ? \"skipped\"\n : \"running\";\n return (\n <div\n key={e.id}\n data-phase-status={status}\n className={[\"p-1.5\", STATUS_BORDER[status]].join(\" \")}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"font-mono text-txt\">{name}</span>\n {e.decision ? (\n <span className=\"text-2xs text-muted\">{e.decision}</span>\n ) : null}\n </div>\n {e.thought ? (\n <div className=\"mt-1 text-muted\">{e.thought}</div>\n ) : null}\n {e.error ? (\n <div className=\"mt-1 text-2xs text-red-400\">{e.error}</div>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * TrajectoryLoggerAppView - the legacy full-screen GUI overlay for the
3
+ * Trajectory Logger app, mounted through the OverlayApp loader
4
+ * (`trajectory-logger-app.ts`) and the app-shell page (`register.ts`).
5
+ *
6
+ * The unified GUI/XR/TUI surface is `TrajectoryLoggerView` (a thin data wrapper
7
+ * over `TrajectoryLoggerSpatialView`); this hand-written overlay stays for the
8
+ * OverlayApp mount path, mirroring how the Phone surface keeps `PhoneAppView`
9
+ * alongside the collapsed `PhoneView`.
10
+ */
11
+ import { type OverlayAppContext } from "@elizaos/ui";
12
+ export type Slot = "now" | "last";
13
+ export declare function TrajectoryLoggerAppView({ exitToApps }: OverlayAppContext): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=TrajectoryLoggerAppView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrajectoryLoggerAppView.d.ts","sourceRoot":"","sources":["../../src/components/TrajectoryLoggerAppView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAU7D,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAGlC,wBAAgB,uBAAuB,CAAC,EAAE,UAAU,EAAE,EAAE,iBAAiB,2CA+FxE"}