@a5c-ai/genty-ui 5.1.1-staging.fee05906043b → 6.0.0

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 (37) hide show
  1. package/dist/components/Agent/AgentAppearanceEditor.d.ts +35 -0
  2. package/dist/components/Agent/AgentAppearanceEditor.d.ts.map +1 -1
  3. package/dist/components/Agent/AgentAppearanceEditor.js +60 -1
  4. package/dist/components/Agent/AgentAppearanceEditor.js.map +1 -1
  5. package/dist/components/Agent/index.d.ts +2 -2
  6. package/dist/components/Agent/index.d.ts.map +1 -1
  7. package/dist/components/Agent/index.js +1 -1
  8. package/dist/components/Agent/index.js.map +1 -1
  9. package/dist/components/Rendering/EffectTreeView.d.ts +20 -0
  10. package/dist/components/Rendering/EffectTreeView.d.ts.map +1 -0
  11. package/dist/components/Rendering/EffectTreeView.js +123 -0
  12. package/dist/components/Rendering/EffectTreeView.js.map +1 -0
  13. package/dist/components/Rendering/MessageTypeRenderer.d.ts +4 -0
  14. package/dist/components/Rendering/MessageTypeRenderer.d.ts.map +1 -0
  15. package/dist/components/Rendering/MessageTypeRenderer.js +108 -0
  16. package/dist/components/Rendering/MessageTypeRenderer.js.map +1 -0
  17. package/dist/components/Rendering/ProgressStatusLine.d.ts +9 -0
  18. package/dist/components/Rendering/ProgressStatusLine.d.ts.map +1 -0
  19. package/dist/components/Rendering/ProgressStatusLine.js +57 -0
  20. package/dist/components/Rendering/ProgressStatusLine.js.map +1 -0
  21. package/dist/components/Rendering/StreamingOutputPanel.d.ts +20 -0
  22. package/dist/components/Rendering/StreamingOutputPanel.d.ts.map +1 -0
  23. package/dist/components/Rendering/StreamingOutputPanel.js +75 -0
  24. package/dist/components/Rendering/StreamingOutputPanel.js.map +1 -0
  25. package/dist/components/Rendering/StructuredDiffView.d.ts +13 -0
  26. package/dist/components/Rendering/StructuredDiffView.d.ts.map +1 -0
  27. package/dist/components/Rendering/StructuredDiffView.js +106 -0
  28. package/dist/components/Rendering/StructuredDiffView.js.map +1 -0
  29. package/dist/components/Rendering/SubagentDrillDown.d.ts +46 -0
  30. package/dist/components/Rendering/SubagentDrillDown.d.ts.map +1 -0
  31. package/dist/components/Rendering/SubagentDrillDown.js +101 -0
  32. package/dist/components/Rendering/SubagentDrillDown.js.map +1 -0
  33. package/dist/components/Rendering/index.d.ts +12 -0
  34. package/dist/components/Rendering/index.d.ts.map +1 -0
  35. package/dist/components/Rendering/index.js +10 -0
  36. package/dist/components/Rendering/index.js.map +1 -0
  37. package/package.json +10 -4
@@ -10,12 +10,47 @@ export interface AgentBadgeSpec {
10
10
  export interface AgentThemeSpec {
11
11
  primaryColor?: string;
12
12
  }
13
+ export type AgentAppearanceRenderer = 'talkinghead' | 'live2d';
14
+ export type AgentAppearanceVisemeSet = 'oculus' | 'arkit';
13
15
  export interface AgentAppearanceSpec {
14
16
  avatar?: AgentAvatarSpec;
15
17
  emoji?: string;
16
18
  badge?: AgentBadgeSpec;
17
19
  theme?: AgentThemeSpec;
20
+ renderer?: AgentAppearanceRenderer;
21
+ avatarModelUrl?: string;
22
+ visemeSet?: AgentAppearanceVisemeSet;
23
+ defaultMood?: string;
24
+ defaultView?: string;
18
25
  }
26
+ /**
27
+ * Flat form shape for the appearance editor. Existing profile fields plus the five
28
+ * realtime avatar fields. All optional — unset fields are OMITTED from the built spec
29
+ * (correct emptiness; the passthrough route stores only set fields).
30
+ */
31
+ export interface AgentAppearanceForm {
32
+ avatar?: AgentAvatarSpec;
33
+ emoji?: string;
34
+ badge?: AgentBadgeSpec;
35
+ theme?: AgentThemeSpec;
36
+ renderer?: AgentAppearanceRenderer;
37
+ avatarModelUrl?: string;
38
+ visemeSet?: AgentAppearanceVisemeSet;
39
+ defaultMood?: string;
40
+ defaultView?: string;
41
+ }
42
+ /**
43
+ * Pure: form -> AgentAppearanceSpec. Preserves avatar/emoji/badge/theme; emits the five
44
+ * flat realtime fields. OMITS unset fields (no '' / null writes) so the appearances
45
+ * passthrough route stores only set fields. No fallback / no placeholder values.
46
+ */
47
+ export declare function buildAppearanceSpec(form?: AgentAppearanceForm): AgentAppearanceSpec;
48
+ /**
49
+ * Pure inverse: AgentAppearanceSpec -> form. Reads set spec fields back into form state.
50
+ * Only set fields are copied — unset spec fields stay unset so a round-trip
51
+ * buildAppearanceSpec(parseAppearanceSpec(spec)) reproduces the same realtime subset.
52
+ */
53
+ export declare function parseAppearanceSpec(spec?: AgentAppearanceSpec): AgentAppearanceForm;
19
54
  export interface AgentAppearanceEditorProps {
20
55
  value?: AgentAppearanceSpec;
21
56
  onChange?: (value: AgentAppearanceSpec) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"AgentAppearanceEditor.d.ts","sourceRoot":"","sources":["../../../src/components/Agent/AgentAppearanceEditor.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,KAAU,EAAE,QAAmB,EAAE,EAAE,0BAA0B,2CAqDpG"}
1
+ {"version":3,"file":"AgentAppearanceEditor.d.ts","sourceRoot":"","sources":["../../../src/components/Agent/AgentAppearanceEditor.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,mBAAwB,GAAG,mBAAmB,CAYvF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,mBAAwB,GAAG,mBAAmB,CAYvF;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,KAAU,EAAE,QAAmB,EAAE,EAAE,0BAA0B,2CAyGpG"}
@@ -1,10 +1,69 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ function hasAvatarFields(avatar) {
3
+ if (!avatar)
4
+ return false;
5
+ return Boolean(avatar.type || avatar.url || avatar.fallbackInitials || avatar.fallbackColor);
6
+ }
7
+ /**
8
+ * Pure: form -> AgentAppearanceSpec. Preserves avatar/emoji/badge/theme; emits the five
9
+ * flat realtime fields. OMITS unset fields (no '' / null writes) so the appearances
10
+ * passthrough route stores only set fields. No fallback / no placeholder values.
11
+ */
12
+ export function buildAppearanceSpec(form = {}) {
13
+ const spec = {};
14
+ if (hasAvatarFields(form.avatar))
15
+ spec.avatar = { ...form.avatar };
16
+ if (form.emoji)
17
+ spec.emoji = form.emoji;
18
+ if (form.badge?.text)
19
+ spec.badge = { ...form.badge };
20
+ if (form.theme?.primaryColor)
21
+ spec.theme = { ...form.theme };
22
+ if (form.renderer)
23
+ spec.renderer = form.renderer;
24
+ if (form.avatarModelUrl)
25
+ spec.avatarModelUrl = form.avatarModelUrl;
26
+ if (form.visemeSet)
27
+ spec.visemeSet = form.visemeSet;
28
+ if (form.defaultMood)
29
+ spec.defaultMood = form.defaultMood;
30
+ if (form.defaultView)
31
+ spec.defaultView = form.defaultView;
32
+ return spec;
33
+ }
34
+ /**
35
+ * Pure inverse: AgentAppearanceSpec -> form. Reads set spec fields back into form state.
36
+ * Only set fields are copied — unset spec fields stay unset so a round-trip
37
+ * buildAppearanceSpec(parseAppearanceSpec(spec)) reproduces the same realtime subset.
38
+ */
39
+ export function parseAppearanceSpec(spec = {}) {
40
+ const form = {};
41
+ if (spec.avatar)
42
+ form.avatar = { ...spec.avatar };
43
+ if (spec.emoji)
44
+ form.emoji = spec.emoji;
45
+ if (spec.badge)
46
+ form.badge = { ...spec.badge };
47
+ if (spec.theme)
48
+ form.theme = { ...spec.theme };
49
+ if (spec.renderer)
50
+ form.renderer = spec.renderer;
51
+ if (spec.avatarModelUrl)
52
+ form.avatarModelUrl = spec.avatarModelUrl;
53
+ if (spec.visemeSet)
54
+ form.visemeSet = spec.visemeSet;
55
+ if (spec.defaultMood)
56
+ form.defaultMood = spec.defaultMood;
57
+ if (spec.defaultView)
58
+ form.defaultView = spec.defaultView;
59
+ return form;
60
+ }
2
61
  export function AgentAppearanceEditor({ value = {}, onChange = () => { } }) {
3
62
  const avatar = value.avatar || {};
4
63
  const theme = value.theme || {};
5
64
  const update = (patch) => onChange({ ...value, ...patch });
6
65
  const updateAvatar = (patch) => update({ avatar: { ...avatar, ...patch } });
7
66
  const updateTheme = (patch) => update({ theme: { ...theme, ...patch } });
8
- return (_jsxs("form", { onSubmit: (event) => event.preventDefault(), className: "stack", "aria-label": "Agent appearance editor", children: [_jsxs("label", { children: ["Avatar URL", _jsx("input", { "aria-label": "Avatar URL", value: avatar.url || '', onChange: (event) => updateAvatar({ type: 'url', url: event.target.value }) })] }), _jsxs("label", { children: ["Emoji", _jsx("input", { "aria-label": "Emoji", value: value.emoji || '', onChange: (event) => update({ emoji: event.target.value }) })] }), _jsxs("label", { children: ["Primary color", _jsx("input", { type: "color", "aria-label": "Primary color", value: theme.primaryColor || '#2563eb', onChange: (event) => updateTheme({ primaryColor: event.target.value }) })] }), _jsxs("label", { children: ["Badge", _jsx("input", { "aria-label": "Badge text", value: value.badge?.text || '', onChange: (event) => update({ badge: { ...(value.badge || {}), text: event.target.value } }) })] }), _jsx("button", { type: "button", "aria-label": "Generate avatar placeholder", onClick: () => updateAvatar({ type: 'generated', fallbackInitials: avatar.fallbackInitials || 'AI' }), children: "Generate placeholder" }), _jsx("button", { type: "submit", "aria-label": "Keep appearance", children: "Keep appearance" })] }));
67
+ return (_jsxs("form", { onSubmit: (event) => event.preventDefault(), className: "stack", "aria-label": "Agent appearance editor", children: [_jsxs("label", { children: ["Avatar URL", _jsx("input", { "aria-label": "Avatar URL", value: avatar.url || '', onChange: (event) => updateAvatar({ type: 'url', url: event.target.value }) })] }), _jsxs("label", { children: ["Emoji", _jsx("input", { "aria-label": "Emoji", value: value.emoji || '', onChange: (event) => update({ emoji: event.target.value }) })] }), _jsxs("label", { children: ["Primary color", _jsx("input", { type: "color", "aria-label": "Primary color", value: theme.primaryColor || '#2563eb', onChange: (event) => updateTheme({ primaryColor: event.target.value }) })] }), _jsxs("label", { children: ["Badge", _jsx("input", { "aria-label": "Badge text", value: value.badge?.text || '', onChange: (event) => update({ badge: { ...(value.badge || {}), text: event.target.value } }) })] }), _jsxs("label", { children: ["Avatar renderer", _jsxs("select", { "aria-label": "Avatar renderer", value: value.renderer || '', onChange: (event) => update({ renderer: (event.target.value || undefined) }), children: [_jsx("option", { value: "", children: "(none)" }), _jsx("option", { value: "talkinghead", children: "talkinghead" }), _jsx("option", { value: "live2d", children: "live2d" })] })] }), _jsxs("label", { children: ["Avatar model URL", _jsx("input", { "aria-label": "Avatar model URL", value: value.avatarModelUrl || '', onChange: (event) => update({ avatarModelUrl: event.target.value }) })] }), _jsxs("label", { children: ["Viseme set", _jsxs("select", { "aria-label": "Viseme set", value: value.visemeSet || '', onChange: (event) => update({ visemeSet: (event.target.value || undefined) }), children: [_jsx("option", { value: "", children: "(none)" }), _jsx("option", { value: "oculus", children: "oculus" }), _jsx("option", { value: "arkit", children: "arkit" })] })] }), _jsxs("label", { children: ["Default mood", _jsx("input", { "aria-label": "Default mood", value: value.defaultMood || '', onChange: (event) => update({ defaultMood: event.target.value }) })] }), _jsxs("label", { children: ["Default view", _jsx("input", { "aria-label": "Default view", value: value.defaultView || '', onChange: (event) => update({ defaultView: event.target.value }) })] }), _jsx("button", { type: "button", "aria-label": "Generate avatar placeholder", onClick: () => updateAvatar({ type: 'generated', fallbackInitials: avatar.fallbackInitials || 'AI' }), children: "Generate placeholder" }), _jsx("button", { type: "submit", "aria-label": "Keep appearance", children: "Keep appearance" })] }));
9
68
  }
10
69
  //# sourceMappingURL=AgentAppearanceEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentAppearanceEditor.js","sourceRoot":"","sources":["../../../src/components/Agent/AgentAppearanceEditor.tsx"],"names":[],"mappings":";AA6BA,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,EAA8B;IACnG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,KAAmC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,YAAY,GAAG,CAAC,KAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IACtG,MAAM,WAAW,GAAG,CAAC,KAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAClG,OAAO,CACL,gBAAM,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAC,OAAO,gBAAY,yBAAyB,aACvG,0CAEE,8BACa,YAAY,EACvB,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAC3E,IACI,EACR,qCAEE,8BACa,OAAO,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAC1D,IACI,EACR,6CAEE,gBACE,IAAI,EAAC,OAAO,gBACD,eAAe,EAC1B,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,SAAS,EACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GACtE,IACI,EACR,qCAEE,8BACa,YAAY,EACvB,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAC5F,IACI,EACR,iBACE,IAAI,EAAC,QAAQ,gBACF,6BAA6B,EACxC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC,qCAG9F,EACT,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,iBAAiB,gCAEzC,IACJ,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"AgentAppearanceEditor.js","sourceRoot":"","sources":["../../../src/components/Agent/AgentAppearanceEditor.tsx"],"names":[],"mappings":";AAmDA,SAAS,eAAe,CAAC,MAAwB;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA4B,EAAE;IAChE,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACnE,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,IAAI,CAAC,KAAK,EAAE,YAAY;QAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjD,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IACnE,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpD,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA4B,EAAE;IAChE,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjD,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IACnE,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpD,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,EAA8B;IACnG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,KAAmC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,YAAY,GAAG,CAAC,KAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IACtG,MAAM,WAAW,GAAG,CAAC,KAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;IAClG,OAAO,CACL,gBAAM,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAC,OAAO,gBAAY,yBAAyB,aACvG,0CAEE,8BACa,YAAY,EACvB,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAC3E,IACI,EACR,qCAEE,8BACa,OAAO,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAC1D,IACI,EACR,6CAEE,gBACE,IAAI,EAAC,OAAO,gBACD,eAAe,EAC1B,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,SAAS,EACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GACtE,IACI,EACR,qCAEE,8BACa,YAAY,EACvB,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAC5F,IACI,EACR,+CAEE,gCACa,iBAAiB,EAC5B,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAwC,EAAE,CAAC,aAGhG,iBAAQ,KAAK,EAAC,EAAE,uBAAgB,EAChC,iBAAQ,KAAK,EAAC,aAAa,4BAAqB,EAChD,iBAAQ,KAAK,EAAC,QAAQ,uBAAgB,IAC/B,IACH,EACR,gDAEE,8BACa,kBAAkB,EAC7B,KAAK,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE,EACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GACnE,IACI,EACR,0CAEE,gCACa,YAAY,EACvB,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE,EAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAyC,EAAE,CAAC,aAGlG,iBAAQ,KAAK,EAAC,EAAE,uBAAgB,EAChC,iBAAQ,KAAK,EAAC,QAAQ,uBAAgB,EACtC,iBAAQ,KAAK,EAAC,OAAO,sBAAe,IAC7B,IACH,EACR,4CAEE,8BACa,cAAc,EACzB,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAChE,IACI,EACR,4CAEE,8BACa,cAAc,EACzB,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAChE,IACI,EACR,iBACE,IAAI,EAAC,QAAQ,gBACF,6BAA6B,EACxC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC,qCAG9F,EACT,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,iBAAiB,gCAEzC,IACJ,CACR,CAAC;AACJ,CAAC"}
@@ -10,8 +10,8 @@ export { AgentPersonaEditor } from './AgentPersonaEditor.js';
10
10
  export type { AgentPersonaEditorProps, AgentPersonaValue, AgentPersonalitySpec, AgentRoleSpec } from './AgentPersonaEditor.js';
11
11
  export { AgentSoulEditor } from './AgentSoulEditor.js';
12
12
  export type { AgentSoulEditorProps } from './AgentSoulEditor.js';
13
- export { AgentAppearanceEditor } from './AgentAppearanceEditor.js';
14
- export type { AgentAppearanceEditorProps, AgentAppearanceSpec, AgentAvatarSpec, AgentBadgeSpec, AgentThemeSpec } from './AgentAppearanceEditor.js';
13
+ export { AgentAppearanceEditor, buildAppearanceSpec, parseAppearanceSpec } from './AgentAppearanceEditor.js';
14
+ export type { AgentAppearanceEditorProps, AgentAppearanceSpec, AgentAvatarSpec, AgentBadgeSpec, AgentThemeSpec, AgentAppearanceForm, AgentAppearanceRenderer, AgentAppearanceVisemeSet } from './AgentAppearanceEditor.js';
15
15
  export { AgentVoiceEditor } from './AgentVoiceEditor.js';
16
16
  export type { AgentVoiceEditorProps, AgentVoiceSpec, AgentTtsConfig } from './AgentVoiceEditor.js';
17
17
  export { DispatchButton } from './DispatchButton.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEtI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEjH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE/H,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEnJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEtI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEjH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE/H,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC7G,YAAY,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3N,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC"}
@@ -4,7 +4,7 @@ export { AgentProfilePage } from './AgentProfilePage.js';
4
4
  export { AgentCreateWizard } from './AgentCreateWizard.js';
5
5
  export { AgentPersonaEditor } from './AgentPersonaEditor.js';
6
6
  export { AgentSoulEditor } from './AgentSoulEditor.js';
7
- export { AgentAppearanceEditor } from './AgentAppearanceEditor.js';
7
+ export { AgentAppearanceEditor, buildAppearanceSpec, parseAppearanceSpec } from './AgentAppearanceEditor.js';
8
8
  export { AgentVoiceEditor } from './AgentVoiceEditor.js';
9
9
  export { DispatchButton } from './DispatchButton.js';
10
10
  export { ApprovalDecisionButtons } from './ApprovalActions.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAG7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type EffectStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
2
+ export interface EffectTreeNode {
3
+ id: string;
4
+ parentId: string | null;
5
+ kind: string;
6
+ title: string;
7
+ status: EffectStatus;
8
+ children: EffectTreeNode[];
9
+ depth: number;
10
+ }
11
+ export interface FlatEffect {
12
+ id: string;
13
+ parentId?: string | null;
14
+ kind: string;
15
+ title: string;
16
+ status: EffectStatus;
17
+ }
18
+ export declare function buildEffectTree(effects: FlatEffect[]): EffectTreeNode[];
19
+ export declare function formatEffectTreeText(tree: EffectTreeNode[]): string;
20
+ export declare function renderEffectTreeHtml(tree: EffectTreeNode[]): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectTreeView.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/EffectTreeView.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAuCvE;AAyBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CAenE;AA2CD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CASnE"}
@@ -0,0 +1,123 @@
1
+ // EffectTreeView.ts — Effect tree construction and rendering (GAP-UX-001 + UX-001a)
2
+ // Pure TypeScript: builds a tree from a flat effect list, renders ASCII or HTML.
3
+ // ---------------------------------------------------------------------------
4
+ // Tree construction
5
+ // ---------------------------------------------------------------------------
6
+ export function buildEffectTree(effects) {
7
+ const nodeMap = new Map();
8
+ // First pass: create nodes
9
+ for (const effect of effects) {
10
+ nodeMap.set(effect.id, {
11
+ id: effect.id,
12
+ parentId: effect.parentId ?? null,
13
+ kind: effect.kind,
14
+ title: effect.title,
15
+ status: effect.status,
16
+ children: [],
17
+ depth: 0,
18
+ });
19
+ }
20
+ // Second pass: wire parent-child relationships
21
+ const roots = [];
22
+ for (const node of nodeMap.values()) {
23
+ if (node.parentId && nodeMap.has(node.parentId)) {
24
+ nodeMap.get(node.parentId).children.push(node);
25
+ }
26
+ else {
27
+ roots.push(node);
28
+ }
29
+ }
30
+ // Third pass: compute depths
31
+ function setDepth(node, depth) {
32
+ node.depth = depth;
33
+ for (const child of node.children) {
34
+ setDepth(child, depth + 1);
35
+ }
36
+ }
37
+ for (const root of roots) {
38
+ setDepth(root, 0);
39
+ }
40
+ return roots;
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // ASCII tree rendering (terminal)
44
+ // ---------------------------------------------------------------------------
45
+ const STATUS_ICON = {
46
+ pending: '○', // ○
47
+ running: '◔', // ◔
48
+ completed: '✔', // ✔
49
+ failed: '✘', // ✘
50
+ skipped: '–', // –
51
+ };
52
+ function renderNodeText(node, prefix, isLast, lines) {
53
+ const connector = isLast ? '└── ' : '├── ';
54
+ const icon = STATUS_ICON[node.status] ?? '?';
55
+ lines.push(`${prefix}${connector}${icon} [${node.kind}] ${node.title} (${node.status})`);
56
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
57
+ for (let i = 0; i < node.children.length; i++) {
58
+ renderNodeText(node.children[i], childPrefix, i === node.children.length - 1, lines);
59
+ }
60
+ }
61
+ export function formatEffectTreeText(tree) {
62
+ if (tree.length === 0)
63
+ return '(empty tree)';
64
+ const lines = [];
65
+ for (let i = 0; i < tree.length; i++) {
66
+ const root = tree[i];
67
+ const icon = STATUS_ICON[root.status] ?? '?';
68
+ lines.push(`${icon} [${root.kind}] ${root.title} (${root.status})`);
69
+ const childPrefix = i < tree.length - 1 ? '│ ' : ' ';
70
+ for (let j = 0; j < root.children.length; j++) {
71
+ renderNodeText(root.children[j], childPrefix, j === root.children.length - 1, lines);
72
+ }
73
+ }
74
+ return lines.join('\n');
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // HTML tree rendering (collapsible)
78
+ // ---------------------------------------------------------------------------
79
+ const STATUS_CLASS = {
80
+ pending: 'effect-pending',
81
+ running: 'effect-running',
82
+ completed: 'effect-completed',
83
+ failed: 'effect-failed',
84
+ skipped: 'effect-skipped',
85
+ };
86
+ function escapeHtml(text) {
87
+ return text
88
+ .replace(/&/g, '&amp;')
89
+ .replace(/</g, '&lt;')
90
+ .replace(/>/g, '&gt;')
91
+ .replace(/"/g, '&quot;');
92
+ }
93
+ function renderNodeHtml(node) {
94
+ const cls = STATUS_CLASS[node.status] ?? 'effect-pending';
95
+ const icon = STATUS_ICON[node.status] ?? '?';
96
+ const hasChildren = node.children.length > 0;
97
+ let html = `<li class="effect-node ${cls}" data-effect-id="${escapeHtml(node.id)}" data-depth="${node.depth}">`;
98
+ if (hasChildren) {
99
+ html += `<details open>`;
100
+ html += `<summary>${icon} <span class="effect-kind">[${escapeHtml(node.kind)}]</span> ${escapeHtml(node.title)} <span class="effect-status">(${node.status})</span></summary>`;
101
+ html += `<ul>`;
102
+ for (const child of node.children) {
103
+ html += renderNodeHtml(child);
104
+ }
105
+ html += `</ul></details>`;
106
+ }
107
+ else {
108
+ html += `${icon} <span class="effect-kind">[${escapeHtml(node.kind)}]</span> ${escapeHtml(node.title)} <span class="effect-status">(${node.status})</span>`;
109
+ }
110
+ html += `</li>`;
111
+ return html;
112
+ }
113
+ export function renderEffectTreeHtml(tree) {
114
+ if (tree.length === 0)
115
+ return '<ul class="effect-tree"><li>(empty tree)</li></ul>';
116
+ let html = '<ul class="effect-tree">';
117
+ for (const root of tree) {
118
+ html += renderNodeHtml(root);
119
+ }
120
+ html += '</ul>';
121
+ return html;
122
+ }
123
+ //# sourceMappingURL=EffectTreeView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectTreeView.js","sourceRoot":"","sources":["../../../src/components/Rendering/EffectTreeView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type MessageType = 'text' | 'code' | 'tool_call' | 'tool_result' | 'thinking' | 'error' | 'system';
2
+ export declare function detectMessageType(content: string): MessageType;
3
+ export declare function formatMessageText(content: string, type: MessageType): string;
4
+ export declare function formatMessageHtml(content: string, type: MessageType): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageTypeRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/MessageTypeRenderer.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAa1G,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAW9D;AAkCD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAa5E;AAwBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAsB5E"}
@@ -0,0 +1,108 @@
1
+ // MessageTypeRenderer.ts — Message type detection and rendering (GAP-UX-001d)
2
+ // Pure TypeScript: detects message types and renders with appropriate formatting.
3
+ // ---------------------------------------------------------------------------
4
+ // Message type detection
5
+ // ---------------------------------------------------------------------------
6
+ const CODE_BLOCK_PATTERN = /^```[\s\S]*```$/m;
7
+ const TOOL_CALL_PATTERN = /^\s*\{[\s\S]*"tool_name"\s*:/;
8
+ const TOOL_RESULT_PATTERN = /^\s*\{[\s\S]*"tool_result"\s*:/;
9
+ const THINKING_PATTERN = /^<thinking>[\s\S]*<\/thinking>$/;
10
+ const ERROR_PATTERN = /^(Error|ERROR|Exception|FATAL|Traceback)[\s:]/;
11
+ const SYSTEM_PATTERN = /^\[system\]|^\[SYSTEM\]/;
12
+ export function detectMessageType(content) {
13
+ const trimmed = content.trim();
14
+ if (SYSTEM_PATTERN.test(trimmed))
15
+ return 'system';
16
+ if (ERROR_PATTERN.test(trimmed))
17
+ return 'error';
18
+ if (THINKING_PATTERN.test(trimmed))
19
+ return 'thinking';
20
+ if (TOOL_CALL_PATTERN.test(trimmed))
21
+ return 'tool_call';
22
+ if (TOOL_RESULT_PATTERN.test(trimmed))
23
+ return 'tool_result';
24
+ if (CODE_BLOCK_PATTERN.test(trimmed))
25
+ return 'code';
26
+ return 'text';
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Text formatting
30
+ // ---------------------------------------------------------------------------
31
+ const TYPE_PREFIX = {
32
+ text: '',
33
+ code: '┌─ code ──────────────────\n',
34
+ tool_call: '⇒ Tool Call:\n',
35
+ tool_result: '⇐ Tool Result:\n',
36
+ thinking: '\u{1F4AD} Thinking:\n',
37
+ error: '⚠ Error:\n',
38
+ system: 'ℹ System:\n',
39
+ };
40
+ const TYPE_SUFFIX = {
41
+ text: '',
42
+ code: '\n└─────────────────────────┘',
43
+ tool_call: '',
44
+ tool_result: '',
45
+ thinking: '',
46
+ error: '',
47
+ system: '',
48
+ };
49
+ function stripCodeFences(content) {
50
+ return content.replace(/^```\w*\n?/, '').replace(/\n?```$/, '');
51
+ }
52
+ function stripThinkingTags(content) {
53
+ return content.replace(/^<thinking>\n?/, '').replace(/\n?<\/thinking>$/, '');
54
+ }
55
+ export function formatMessageText(content, type) {
56
+ let body = content;
57
+ switch (type) {
58
+ case 'code':
59
+ body = stripCodeFences(body.trim());
60
+ break;
61
+ case 'thinking':
62
+ body = stripThinkingTags(body.trim());
63
+ break;
64
+ }
65
+ return `${TYPE_PREFIX[type]}${body}${TYPE_SUFFIX[type]}`;
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // HTML rendering
69
+ // ---------------------------------------------------------------------------
70
+ function escapeHtml(text) {
71
+ return text
72
+ .replace(/&/g, '&amp;')
73
+ .replace(/</g, '&lt;')
74
+ .replace(/>/g, '&gt;')
75
+ .replace(/"/g, '&quot;');
76
+ }
77
+ const TYPE_HTML_CLASS = {
78
+ text: 'msg-text',
79
+ code: 'msg-code',
80
+ tool_call: 'msg-tool-call',
81
+ tool_result: 'msg-tool-result',
82
+ thinking: 'msg-thinking',
83
+ error: 'msg-error',
84
+ system: 'msg-system',
85
+ };
86
+ export function formatMessageHtml(content, type) {
87
+ const cls = TYPE_HTML_CLASS[type];
88
+ let body = content;
89
+ switch (type) {
90
+ case 'code':
91
+ body = stripCodeFences(body.trim());
92
+ return `<div class="${cls}"><pre><code>${escapeHtml(body)}</code></pre></div>`;
93
+ case 'thinking':
94
+ body = stripThinkingTags(body.trim());
95
+ return `<div class="${cls}"><em>${escapeHtml(body)}</em></div>`;
96
+ case 'error':
97
+ return `<div class="${cls}"><strong>${escapeHtml(body)}</strong></div>`;
98
+ case 'tool_call':
99
+ return `<div class="${cls}"><pre class="tool-call">${escapeHtml(body)}</pre></div>`;
100
+ case 'tool_result':
101
+ return `<div class="${cls}"><pre class="tool-result">${escapeHtml(body)}</pre></div>`;
102
+ case 'system':
103
+ return `<div class="${cls}"><span class="system-msg">${escapeHtml(body)}</span></div>`;
104
+ default:
105
+ return `<div class="${cls}"><p>${escapeHtml(body)}</p></div>`;
106
+ }
107
+ }
108
+ //# sourceMappingURL=MessageTypeRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageTypeRenderer.js","sourceRoot":"","sources":["../../../src/components/Rendering/MessageTypeRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ProgressData {
2
+ current: number;
3
+ total: number;
4
+ label: string;
5
+ startedAt: number;
6
+ estimatedCompletion?: number;
7
+ }
8
+ export declare function formatProgressBar(data: ProgressData, width?: number): string;
9
+ export declare function formatStatusLine(data: ProgressData, now?: number): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressStatusLine.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/ProgressStatusLine.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAQhF;AAqCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQzE"}
@@ -0,0 +1,57 @@
1
+ // ProgressStatusLine.ts — Progress bar and status line formatting (GAP-UX-001e)
2
+ // Pure TypeScript: renders progress bars and status lines as strings.
3
+ // ---------------------------------------------------------------------------
4
+ // Progress bar rendering
5
+ // ---------------------------------------------------------------------------
6
+ const FILL_CHAR = '█'; // █
7
+ const EMPTY_CHAR = '░'; // ░
8
+ export function formatProgressBar(data, width = 20) {
9
+ const safeTotal = Math.max(data.total, 1);
10
+ const ratio = Math.min(Math.max(data.current / safeTotal, 0), 1);
11
+ const filled = Math.round(ratio * width);
12
+ const empty = width - filled;
13
+ const percent = Math.round(ratio * 100);
14
+ return `[${FILL_CHAR.repeat(filled)}${EMPTY_CHAR.repeat(empty)}] ${percent}%`;
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // Time remaining
18
+ // ---------------------------------------------------------------------------
19
+ function formatDuration(ms) {
20
+ if (ms < 0)
21
+ return '0s';
22
+ const totalSeconds = Math.floor(ms / 1000);
23
+ if (totalSeconds < 60)
24
+ return `${totalSeconds}s`;
25
+ const minutes = Math.floor(totalSeconds / 60);
26
+ const seconds = totalSeconds % 60;
27
+ if (minutes < 60)
28
+ return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
29
+ const hours = Math.floor(minutes / 60);
30
+ const remainingMinutes = minutes % 60;
31
+ return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;
32
+ }
33
+ function estimateRemaining(data, now) {
34
+ if (data.estimatedCompletion != null) {
35
+ const remaining = data.estimatedCompletion - now;
36
+ return remaining > 0 ? formatDuration(remaining) : 'any moment';
37
+ }
38
+ // Derive from elapsed time and progress
39
+ const elapsed = now - data.startedAt;
40
+ if (elapsed <= 0 || data.current <= 0)
41
+ return null;
42
+ const totalEstimate = (elapsed / data.current) * data.total;
43
+ const remaining = totalEstimate - elapsed;
44
+ return remaining > 0 ? formatDuration(remaining) : 'any moment';
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Status line rendering
48
+ // ---------------------------------------------------------------------------
49
+ export function formatStatusLine(data, now) {
50
+ const currentTime = now ?? Date.now();
51
+ const bar = formatProgressBar(data);
52
+ const stepLabel = `Step ${data.current}/${data.total}`;
53
+ const remaining = estimateRemaining(data, currentTime);
54
+ const remainingText = remaining ? ` (${remaining} remaining)` : '';
55
+ return `${stepLabel} — ${data.label} ${bar}${remainingText}`;
56
+ }
57
+ //# sourceMappingURL=ProgressStatusLine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressStatusLine.js","sourceRoot":"","sources":["../../../src/components/Rendering/ProgressStatusLine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface StreamPanel {
2
+ id: string;
3
+ title: string;
4
+ lines: string[];
5
+ maxLines: number;
6
+ autoScroll: boolean;
7
+ }
8
+ export declare class StreamPanelManager {
9
+ private panels;
10
+ addPanel(id: string, title: string, opts?: {
11
+ maxLines?: number;
12
+ autoScroll?: boolean;
13
+ }): StreamPanel;
14
+ appendLine(panelId: string, line: string): void;
15
+ getPanel(id: string): StreamPanel | undefined;
16
+ listPanels(): StreamPanel[];
17
+ removePanel(id: string): boolean;
18
+ clear(panelId: string): void;
19
+ }
20
+ export declare function formatPanelOutput(panel: StreamPanel, width?: number): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamingOutputPanel.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/StreamingOutputPanel.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAkC;IAEhD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,WAAW;IAYpG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C,UAAU,IAAI,WAAW,EAAE;IAI3B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIhC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAI7B;AAUD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CA6BhF"}
@@ -0,0 +1,75 @@
1
+ // StreamingOutputPanel.ts — Streaming output panel management (GAP-UX-001f)
2
+ // Pure TypeScript: manages panels of streaming output with scrollback.
3
+ // ---------------------------------------------------------------------------
4
+ // StreamPanelManager
5
+ // ---------------------------------------------------------------------------
6
+ export class StreamPanelManager {
7
+ panels = new Map();
8
+ addPanel(id, title, opts) {
9
+ const panel = {
10
+ id,
11
+ title,
12
+ lines: [],
13
+ maxLines: opts?.maxLines ?? 500,
14
+ autoScroll: opts?.autoScroll ?? true,
15
+ };
16
+ this.panels.set(id, panel);
17
+ return panel;
18
+ }
19
+ appendLine(panelId, line) {
20
+ const panel = this.panels.get(panelId);
21
+ if (!panel)
22
+ return;
23
+ panel.lines.push(line);
24
+ // Trim from front if exceeding maxLines
25
+ if (panel.lines.length > panel.maxLines) {
26
+ const excess = panel.lines.length - panel.maxLines;
27
+ panel.lines.splice(0, excess);
28
+ }
29
+ }
30
+ getPanel(id) {
31
+ return this.panels.get(id);
32
+ }
33
+ listPanels() {
34
+ return Array.from(this.panels.values());
35
+ }
36
+ removePanel(id) {
37
+ return this.panels.delete(id);
38
+ }
39
+ clear(panelId) {
40
+ const panel = this.panels.get(panelId);
41
+ if (panel)
42
+ panel.lines = [];
43
+ }
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Panel text rendering
47
+ // ---------------------------------------------------------------------------
48
+ function repeatChar(char, count) {
49
+ return count > 0 ? char.repeat(count) : '';
50
+ }
51
+ export function formatPanelOutput(panel, width = 80) {
52
+ const innerWidth = Math.max(width - 4, 10); // 2 border chars + 2 padding
53
+ const titleText = ` ${panel.title} `;
54
+ const titlePadding = Math.max(innerWidth - titleText.length, 0);
55
+ const leftPad = Math.floor(titlePadding / 2);
56
+ const rightPad = titlePadding - leftPad;
57
+ const lines = [];
58
+ // Top border with title
59
+ lines.push(`┌${repeatChar('─', leftPad)}${titleText}${repeatChar('─', rightPad)}┐`);
60
+ // Content lines
61
+ if (panel.lines.length === 0) {
62
+ lines.push(`│ ${repeatChar(' ', innerWidth)} │`);
63
+ }
64
+ else {
65
+ for (const line of panel.lines) {
66
+ const truncated = line.length > innerWidth ? line.slice(0, innerWidth - 1) + '…' : line;
67
+ const padded = truncated + repeatChar(' ', innerWidth - truncated.length);
68
+ lines.push(`│ ${padded} │`);
69
+ }
70
+ }
71
+ // Bottom border
72
+ lines.push(`└${repeatChar('─', innerWidth + 2)}┘`);
73
+ return lines.join('\n');
74
+ }
75
+ //# sourceMappingURL=StreamingOutputPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamingOutputPanel.js","sourceRoot":"","sources":["../../../src/components/Rendering/StreamingOutputPanel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type DiffLineType = 'add' | 'remove' | 'context';
2
+ export interface DiffLine {
3
+ type: DiffLineType;
4
+ content: string;
5
+ lineNumber: number | null;
6
+ }
7
+ export interface DiffHunk {
8
+ header: string;
9
+ lines: DiffLine[];
10
+ }
11
+ export declare function parseDiffOutput(diffText: string): DiffHunk[];
12
+ export declare function formatDiffText(hunks: DiffHunk[]): string;
13
+ export declare function formatDiffHtml(hunks: DiffHunk[]): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuredDiffView.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/StructuredDiffView.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAMD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAyC5D;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAaxD;AA0BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAuBxD"}
@@ -0,0 +1,106 @@
1
+ // StructuredDiffView.ts — Unified diff parsing and rendering (GAP-UX-001b)
2
+ // Pure TypeScript: parses unified diff output, renders text or HTML.
3
+ // ---------------------------------------------------------------------------
4
+ // Diff parsing
5
+ // ---------------------------------------------------------------------------
6
+ export function parseDiffOutput(diffText) {
7
+ const hunks = [];
8
+ const rawLines = diffText.split('\n');
9
+ let currentHunk = null;
10
+ let oldLine = 0;
11
+ let newLine = 0;
12
+ for (const rawLine of rawLines) {
13
+ // Hunk header: @@ -oldStart,oldCount +newStart,newCount @@
14
+ const hunkMatch = rawLine.match(/^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@(.*)$/);
15
+ if (hunkMatch) {
16
+ currentHunk = { header: rawLine, lines: [] };
17
+ hunks.push(currentHunk);
18
+ oldLine = parseInt(hunkMatch[1], 10);
19
+ newLine = parseInt(hunkMatch[2], 10);
20
+ continue;
21
+ }
22
+ // Skip file headers (---, +++, diff, index)
23
+ if (rawLine.startsWith('---') || rawLine.startsWith('+++') || rawLine.startsWith('diff ') || rawLine.startsWith('index ')) {
24
+ continue;
25
+ }
26
+ if (!currentHunk)
27
+ continue;
28
+ if (rawLine.startsWith('+')) {
29
+ currentHunk.lines.push({ type: 'add', content: rawLine.slice(1), lineNumber: newLine });
30
+ newLine++;
31
+ }
32
+ else if (rawLine.startsWith('-')) {
33
+ currentHunk.lines.push({ type: 'remove', content: rawLine.slice(1), lineNumber: oldLine });
34
+ oldLine++;
35
+ }
36
+ else if (rawLine.startsWith(' ') || rawLine === '') {
37
+ const content = rawLine.startsWith(' ') ? rawLine.slice(1) : rawLine;
38
+ currentHunk.lines.push({ type: 'context', content, lineNumber: newLine });
39
+ oldLine++;
40
+ newLine++;
41
+ }
42
+ }
43
+ return hunks;
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Text rendering
47
+ // ---------------------------------------------------------------------------
48
+ export function formatDiffText(hunks) {
49
+ if (hunks.length === 0)
50
+ return '(no changes)';
51
+ const lines = [];
52
+ for (const hunk of hunks) {
53
+ lines.push(hunk.header);
54
+ for (const line of hunk.lines) {
55
+ const prefix = line.type === 'add' ? '+' : line.type === 'remove' ? '-' : ' ';
56
+ const lineNum = line.lineNumber != null ? String(line.lineNumber).padStart(4) : ' ';
57
+ lines.push(`${lineNum} ${prefix} ${line.content}`);
58
+ }
59
+ }
60
+ return lines.join('\n');
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // HTML rendering
64
+ // ---------------------------------------------------------------------------
65
+ function escapeHtml(text) {
66
+ return text
67
+ .replace(/&/g, '&amp;')
68
+ .replace(/</g, '&lt;')
69
+ .replace(/>/g, '&gt;')
70
+ .replace(/"/g, '&quot;');
71
+ }
72
+ const DIFF_LINE_CLASS = {
73
+ add: 'diff-add',
74
+ remove: 'diff-remove',
75
+ context: 'diff-context',
76
+ };
77
+ const DIFF_LINE_BG = {
78
+ add: '#e6ffec',
79
+ remove: '#ffebe9',
80
+ context: 'transparent',
81
+ };
82
+ export function formatDiffHtml(hunks) {
83
+ if (hunks.length === 0)
84
+ return '<div class="diff-view">(no changes)</div>';
85
+ let html = '<div class="diff-view">';
86
+ for (const hunk of hunks) {
87
+ html += `<div class="diff-hunk">`;
88
+ html += `<div class="diff-header">${escapeHtml(hunk.header)}</div>`;
89
+ html += `<table class="diff-table">`;
90
+ for (const line of hunk.lines) {
91
+ const cls = DIFF_LINE_CLASS[line.type];
92
+ const bg = DIFF_LINE_BG[line.type];
93
+ const prefix = line.type === 'add' ? '+' : line.type === 'remove' ? '-' : ' ';
94
+ const lineNum = line.lineNumber != null ? String(line.lineNumber) : '';
95
+ html += `<tr class="${cls}" style="background:${bg}">`;
96
+ html += `<td class="diff-line-num">${lineNum}</td>`;
97
+ html += `<td class="diff-prefix">${prefix}</td>`;
98
+ html += `<td class="diff-content">${escapeHtml(line.content)}</td>`;
99
+ html += `</tr>`;
100
+ }
101
+ html += `</table></div>`;
102
+ }
103
+ html += '</div>';
104
+ return html;
105
+ }
106
+ //# sourceMappingURL=StructuredDiffView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuredDiffView.js","sourceRoot":"","sources":["../../../src/components/Rendering/StructuredDiffView.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qEAAqE;AAmBrE,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,WAAW,GAAoB,IAAI,CAAC;IACxC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,2DAA2D;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACtF,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1H,SAAS;QACX,CAAC;QAED,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YACxF,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3F,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACrE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1E,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,eAAe,GAAiC;IACpD,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;CACxB,CAAC;AAEF,MAAM,YAAY,GAAiC;IACjD,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,2CAA2C,CAAC;IAE3E,IAAI,IAAI,GAAG,yBAAyB,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,yBAAyB,CAAC;QAClC,IAAI,IAAI,4BAA4B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpE,IAAI,IAAI,4BAA4B,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,IAAI,cAAc,GAAG,uBAAuB,EAAE,IAAI,CAAC;YACvD,IAAI,IAAI,6BAA6B,OAAO,OAAO,CAAC;YACpD,IAAI,IAAI,2BAA2B,MAAM,OAAO,CAAC;YACjD,IAAI,IAAI,4BAA4B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACpE,IAAI,IAAI,OAAO,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,gBAAgB,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,QAAQ,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,46 @@
1
+ export type SubagentStatus = 'idle' | 'running' | 'completed' | 'failed' | 'cancelled';
2
+ export interface SubagentEffect {
3
+ id: string;
4
+ kind: string;
5
+ title: string;
6
+ status: string;
7
+ }
8
+ export interface SubagentView {
9
+ agentId: string;
10
+ status: SubagentStatus;
11
+ tokenUsage: {
12
+ input: number;
13
+ output: number;
14
+ };
15
+ effects: SubagentEffect[];
16
+ duration: number;
17
+ model: string;
18
+ }
19
+ export interface SubagentDrillDownData {
20
+ agents: SubagentView[];
21
+ selectedAgentId?: string;
22
+ expandedEffects: Set<string>;
23
+ }
24
+ export interface ProgressAgent {
25
+ id: string;
26
+ status?: string;
27
+ model?: string;
28
+ tokenUsage?: {
29
+ input?: number;
30
+ output?: number;
31
+ };
32
+ effects?: Array<{
33
+ id: string;
34
+ kind: string;
35
+ title: string;
36
+ status: string;
37
+ }>;
38
+ startedAt?: number;
39
+ completedAt?: number;
40
+ }
41
+ export interface ProgressTracker {
42
+ agents: ProgressAgent[];
43
+ }
44
+ export declare function buildSubagentView(tracker: ProgressTracker): SubagentDrillDownData;
45
+ export declare function formatSubagentSummary(view: SubagentView): string;
46
+ export declare function formatSubagentDetail(view: SubagentView): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentDrillDown.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/SubagentDrillDown.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAMD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,qBAAqB,CAuBjF;AA+CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMhE;AAMD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAoB/D"}
@@ -0,0 +1,101 @@
1
+ // SubagentDrillDown.ts — Subagent drill-down view construction and rendering (GAP-SUBOBS-005)
2
+ // Pure TypeScript: builds subagent views and renders summary/detail strings.
3
+ // ---------------------------------------------------------------------------
4
+ // View construction
5
+ // ---------------------------------------------------------------------------
6
+ export function buildSubagentView(tracker) {
7
+ const agents = tracker.agents.map((agent) => ({
8
+ agentId: agent.id,
9
+ status: normalizeStatus(agent.status),
10
+ tokenUsage: {
11
+ input: agent.tokenUsage?.input ?? 0,
12
+ output: agent.tokenUsage?.output ?? 0,
13
+ },
14
+ effects: (agent.effects ?? []).map((e) => ({
15
+ id: e.id,
16
+ kind: e.kind,
17
+ title: e.title,
18
+ status: e.status,
19
+ })),
20
+ duration: computeDuration(agent.startedAt, agent.completedAt),
21
+ model: agent.model ?? 'unknown',
22
+ }));
23
+ return {
24
+ agents,
25
+ selectedAgentId: undefined,
26
+ expandedEffects: new Set(),
27
+ };
28
+ }
29
+ function normalizeStatus(status) {
30
+ const s = (status ?? '').toLowerCase();
31
+ if (s === 'idle' || s === 'running' || s === 'completed' || s === 'failed' || s === 'cancelled') {
32
+ return s;
33
+ }
34
+ if (s === 'error')
35
+ return 'failed';
36
+ if (s === 'done' || s === 'success')
37
+ return 'completed';
38
+ return 'idle';
39
+ }
40
+ function computeDuration(startedAt, completedAt) {
41
+ if (startedAt == null)
42
+ return 0;
43
+ const end = completedAt ?? Date.now();
44
+ return Math.max(end - startedAt, 0);
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Formatting helpers
48
+ // ---------------------------------------------------------------------------
49
+ function formatDuration(ms) {
50
+ if (ms < 1000)
51
+ return `${ms}ms`;
52
+ const seconds = Math.floor(ms / 1000);
53
+ if (seconds < 60)
54
+ return `${seconds}s`;
55
+ const minutes = Math.floor(seconds / 60);
56
+ const remainingSeconds = seconds % 60;
57
+ return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
58
+ }
59
+ function formatTokens(usage) {
60
+ return `${usage.input.toLocaleString()}in/${usage.output.toLocaleString()}out`;
61
+ }
62
+ const STATUS_ICON = {
63
+ idle: '○', // ○
64
+ running: '◔', // ◔
65
+ completed: '✔', // ✔
66
+ failed: '✘', // ✘
67
+ cancelled: '–', // –
68
+ };
69
+ // ---------------------------------------------------------------------------
70
+ // Summary rendering (one-line per agent)
71
+ // ---------------------------------------------------------------------------
72
+ export function formatSubagentSummary(view) {
73
+ const icon = STATUS_ICON[view.status] ?? '?';
74
+ const dur = formatDuration(view.duration);
75
+ const tokens = formatTokens(view.tokenUsage);
76
+ const effectCount = view.effects.length;
77
+ return `${icon} ${view.agentId} [${view.model}] ${view.status} | ${dur} | ${tokens} | ${effectCount} effect${effectCount !== 1 ? 's' : ''}`;
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Detail rendering (expanded with effects)
81
+ // ---------------------------------------------------------------------------
82
+ export function formatSubagentDetail(view) {
83
+ const lines = [];
84
+ const icon = STATUS_ICON[view.status] ?? '?';
85
+ lines.push(`${icon} Agent: ${view.agentId}`);
86
+ lines.push(` Model: ${view.model}`);
87
+ lines.push(` Status: ${view.status}`);
88
+ lines.push(` Duration: ${formatDuration(view.duration)}`);
89
+ lines.push(` Tokens: ${formatTokens(view.tokenUsage)}`);
90
+ if (view.effects.length > 0) {
91
+ lines.push(` Effects (${view.effects.length}):`);
92
+ for (const effect of view.effects) {
93
+ lines.push(` │ [${effect.kind}] ${effect.title} (${effect.status})`);
94
+ }
95
+ }
96
+ else {
97
+ lines.push(' Effects: (none)');
98
+ }
99
+ return lines.join('\n');
100
+ }
101
+ //# sourceMappingURL=SubagentDrillDown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentDrillDown.js","sourceRoot":"","sources":["../../../src/components/Rendering/SubagentDrillDown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { buildEffectTree, formatEffectTreeText, renderEffectTreeHtml, } from './EffectTreeView.js';
2
+ export type { EffectStatus, EffectTreeNode, FlatEffect, } from './EffectTreeView.js';
3
+ export { formatProgressBar, formatStatusLine, } from './ProgressStatusLine.js';
4
+ export type { ProgressData, } from './ProgressStatusLine.js';
5
+ export { StreamPanelManager, formatPanelOutput, } from './StreamingOutputPanel.js';
6
+ export type { StreamPanel, } from './StreamingOutputPanel.js';
7
+ export { parseDiffOutput, formatDiffText, formatDiffHtml, } from './StructuredDiffView.js';
8
+ export type { DiffLine, DiffLineType, DiffHunk, } from './StructuredDiffView.js';
9
+ export { detectMessageType, formatMessageText, formatMessageHtml, } from './MessageTypeRenderer.js';
10
+ export type { MessageType, } from './MessageTypeRenderer.js';
11
+ export { buildSubagentView, formatSubagentSummary, formatSubagentDetail, } from './SubagentDrillDown.js';
12
+ export type { SubagentStatus, SubagentEffect, SubagentView, SubagentDrillDownData, ProgressAgent, ProgressTracker, } from './SubagentDrillDown.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Rendering/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,YAAY,GACb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,WAAW,GACZ,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,eAAe,GAChB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,10 @@
1
+ // Rendering primitives barrel export — pure TypeScript rendering utilities
2
+ // for effect trees, progress bars, streaming panels, diffs, message types,
3
+ // and subagent drill-down views.
4
+ export { buildEffectTree, formatEffectTreeText, renderEffectTreeHtml, } from './EffectTreeView.js';
5
+ export { formatProgressBar, formatStatusLine, } from './ProgressStatusLine.js';
6
+ export { StreamPanelManager, formatPanelOutput, } from './StreamingOutputPanel.js';
7
+ export { parseDiffOutput, formatDiffText, formatDiffHtml, } from './StructuredDiffView.js';
8
+ export { detectMessageType, formatMessageText, formatMessageHtml, } from './MessageTypeRenderer.js';
9
+ export { buildSubagentView, formatSubagentSummary, formatSubagentDetail, } from './SubagentDrillDown.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Rendering/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,iCAAiC;AAEjC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a5c-ai/genty-ui",
3
- "version": "5.1.1-staging.fee05906043b",
3
+ "version": "6.0.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Shared UI foundation and session-flow projection surface for browser and React Native adapters apps",
@@ -102,6 +102,12 @@
102
102
  "types": "./dist/components/primitives/index.d.ts",
103
103
  "default": "./dist/components/primitives/index.js"
104
104
  }
105
+ },
106
+ "./rendering": {
107
+ "import": {
108
+ "types": "./dist/components/Rendering/index.d.ts",
109
+ "default": "./dist/components/Rendering/index.js"
110
+ }
105
111
  }
106
112
  },
107
113
  "files": [
@@ -117,13 +123,13 @@
117
123
  "build:realtime": "npm run build --workspace=@a5c-ai/atlas && npm run build --workspace=@a5c-ai/comm-adapter && npm run build",
118
124
  "clean": "rimraf dist tsconfig.tsbuildinfo",
119
125
  "codegen": "tsx src/codegen/swift-types.ts && tsx src/codegen/kotlin-types.ts",
120
- "test": "vitest run --root ../../.. --config vitest.config.ts packages/adapters/ui",
121
- "test:realtime": "vitest run --root ../../.. --config vitest.config.ts \"packages/adapters/ui/src/session-flow*.test.ts\" \"packages/adapters/ui/src/screens/SessionDetailScreen.test.tsx\" \"packages/adapters/ui/src/release-verification.test.ts\"",
126
+ "test": "vitest run --root ../../.. --config vitest.config.ts packages/genty/ui",
127
+ "test:realtime": "vitest run --root ../../.. --config vitest.config.ts \"packages/genty/ui/src/session-flow*.test.ts\" \"packages/genty/ui/src/screens/SessionDetailScreen.test.tsx\" \"packages/genty/ui/src/release-verification.test.ts\"",
122
128
  "verify:release": "node ./scripts/verify-release.mjs",
123
129
  "prepublishOnly": "npm run build:realtime && npm run test:realtime && npm run verify:release"
124
130
  },
125
131
  "dependencies": {
126
- "@a5c-ai/comm-adapter": "5.1.1-staging.fee05906043b",
132
+ "@a5c-ai/comm-adapter": "6.0.0",
127
133
  "react": "^19.1.0",
128
134
  "react-dom": "^19.1.0",
129
135
  "react-native": "^0.85.3",