@visuno/angular 0.0.0-stage → 0.1.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 (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,63 @@
1
+ import { EventEmitter, OnDestroy } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import { ReducedMotionService } from '../core/reduced-motion.service';
4
+ import * as i0 from "@angular/core";
5
+ /** primary is the main action, on the accent. ink is the old name for primary and still works. */
6
+ export type ButtonVariant = 'primary' | 'accent' | 'soft' | 'line' | 'ghost' | 'ink';
7
+ export type ButtonSize = 'sm' | 'md' | 'lg';
8
+ /** A pill button in one of the site's five styles and three sizes, with busy, done and pressed states. */
9
+ export declare class ButtonComponent implements OnDestroy {
10
+ private readonly motion;
11
+ /** primary/accent for the main action, soft and line for the rest, ghost for the quietest. */
12
+ variant?: ButtonVariant;
13
+ size: ButtonSize;
14
+ /** An icon before the label. */
15
+ icon?: VoIconName;
16
+ /** The label (alternative to projected content). */
17
+ label?: string;
18
+ /** Shows the busy face: a spinner (or thinking dots) and busyLabel. Clicks are ignored. */
19
+ busy?: boolean;
20
+ /** Shows the done face: a check that pops in and doneLabel. Clicks are ignored. */
21
+ done?: boolean;
22
+ /** The label while busy, like "Publishing". Defaults to the label. */
23
+ busyLabel?: string;
24
+ /** The label once done, like "Published". Defaults to the label. */
25
+ doneLabel?: string;
26
+ /** The icon on the done face. Defaults to a check that pops in. */
27
+ doneIcon?: VoIconName;
28
+ /** spin, or think: the agent's four turning dots with a shimmering label. */
29
+ busyGlyph: 'spin' | 'think';
30
+ /** The done face turns green. */
31
+ success?: boolean;
32
+ /** How long the done face stays when the button runs itself. */
33
+ doneFor: number;
34
+ /** Going back from done to the label blurs across (the default) instead of switching at once. */
35
+ fadeBack: boolean;
36
+ /** For a toggle: whether it is on, as aria-pressed. */
37
+ pressed?: boolean;
38
+ /**
39
+ * A plain click. Return a Promise (resolve with any value) and the button
40
+ * runs by itself: busy until it settles, then done for `doneFor` ms.
41
+ */
42
+ handler?: () => void | Promise<unknown>;
43
+ /** Emitted on a plain click (when not busy/done). */
44
+ clicked: EventEmitter<MouseEvent>;
45
+ private auto;
46
+ private alive;
47
+ private timer?;
48
+ private swapTimer?;
49
+ /** True while the face blurs out before it is swapped. */
50
+ out: boolean;
51
+ constructor(motion: ReducedMotionService);
52
+ get isBusy(): boolean;
53
+ get isDone(): boolean;
54
+ get think(): boolean;
55
+ get variantCls(): string | null;
56
+ get shownLabel(): string | undefined;
57
+ onClick(e: MouseEvent): void;
58
+ /** Blurs the done face out before it becomes the idle label again (fadeBack). */
59
+ private back;
60
+ ngOnDestroy(): void;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<ButtonComponent, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<ButtonComponent, "vo-button", never, { "variant": { "alias": "variant"; "required": false; }; "size": { "alias": "size"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "label": { "alias": "label"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; "done": { "alias": "done"; "required": false; }; "busyLabel": { "alias": "busyLabel"; "required": false; }; "doneLabel": { "alias": "doneLabel"; "required": false; }; "doneIcon": { "alias": "doneIcon"; "required": false; }; "busyGlyph": { "alias": "busyGlyph"; "required": false; }; "success": { "alias": "success"; "required": false; }; "doneFor": { "alias": "doneFor"; "required": false; }; "fadeBack": { "alias": "fadeBack"; "required": false; }; "pressed": { "alias": "pressed"; "required": false; }; "handler": { "alias": "handler"; "required": false; }; }, { "clicked": "clicked"; }, never, ["*"], true, never>;
63
+ }
@@ -0,0 +1,21 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** How much the card insets its header, body and footer. */
4
+ export type CardPad = 'none' | 'sm' | 'md';
5
+ export declare class CardComponent {
6
+ /** A title shown in the header. */
7
+ title?: string;
8
+ /** A subtitle under the title. */
9
+ subtitle?: string;
10
+ /** How the footer's actions align. 'end' by default. */
11
+ footerAlign: 'start' | 'end' | 'between';
12
+ /** Inset for header/body/footer. 'md' by default. */
13
+ pad: CardPad;
14
+ /** Makes the whole card a hit target: lifts on hover, takes focus, fires (clicked) on Enter/Space. */
15
+ interactive: boolean;
16
+ /** Emitted when an interactive card is activated (click or Enter/Space). */
17
+ clicked: EventEmitter<void>;
18
+ onKeyDown(e: KeyboardEvent): void;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<CardComponent, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "vo-card", never, { "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "footerAlign": { "alias": "footerAlign"; "required": false; }; "pad": { "alias": "pad"; "required": false; }; "interactive": { "alias": "interactive"; "required": false; }; }, { "clicked": "clicked"; }, never, ["[card-action]", "*", "[card-footer]"], true, never>;
21
+ }
@@ -0,0 +1,97 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { ReducedMotionService } from '../core/reduced-motion.service';
3
+ import * as i0 from "@angular/core";
4
+ /** A single diff line. add and del lines are coloured; ctx lines are unchanged context. */
5
+ export interface DiffLine {
6
+ /** add and del lines are coloured; ctx lines are unchanged context. */
7
+ kind: 'add' | 'del' | 'ctx';
8
+ /** The line number shown in the gutter. */
9
+ line: number;
10
+ text: string;
11
+ }
12
+ /** One change to review, keep or undo on its own. */
13
+ export interface Hunk {
14
+ /** Identifies the hunk in `decisions`. Defaults to "<file name>#<index>". */
15
+ key?: string;
16
+ /** What the change does, like "Use the shared button". */
17
+ title: string;
18
+ lines: DiffLine[];
19
+ }
20
+ /** A changed file, shown in the list and opened in the diff. */
21
+ export interface ChangedFile {
22
+ /** Like "PricingCard.tsx". Its extension becomes the type label. */
23
+ name: string;
24
+ /** Shown above the diff, like "src/PricingCard.tsx". Defaults to the name. */
25
+ path?: string;
26
+ hunks: Hunk[];
27
+ }
28
+ /** Whether a hunk was kept or undone. */
29
+ export type HunkDecision = 'kept' | 'undone';
30
+ /** Payload emitted when the person asks the agent about a line. */
31
+ export interface LineComment {
32
+ file: ChangedFile;
33
+ hunk: Hunk;
34
+ line: DiffLine;
35
+ text: string;
36
+ }
37
+ /** A file row's rolled-up state across its hunks. */
38
+ type FileState = 'kept' | 'undone' | 'some' | '';
39
+ /** Live state for one line's comment box. */
40
+ interface CommentBox {
41
+ draft: string;
42
+ sent?: string;
43
+ }
44
+ export declare class ChangeReviewComponent implements OnChanges, OnDestroy {
45
+ /** The files to review. */
46
+ files: ChangedFile[];
47
+ /** The file shown on the right, by index. Leave it out to let the list pick it. */
48
+ file?: number;
49
+ defaultFile: number;
50
+ /** Kept or undone, by hunk key. Leave it out to let the buttons keep track. */
51
+ decisions?: Record<string, HunkDecision>;
52
+ defaultDecisions: Record<string, HunkDecision>;
53
+ /** Header over the file list. Defaults to "N files changed". */
54
+ title?: string;
55
+ /** Emitted when the shown file changes. */
56
+ fileChange: EventEmitter<number>;
57
+ /** Emitted when any hunk's decision changes. */
58
+ decisionsChange: EventEmitter<Record<string, HunkDecision>>;
59
+ /** Emitted when the person asks the agent about a line. Without a question it sends "Why this change?". */
60
+ comment: EventEmitter<LineComment>;
61
+ private commentInputs;
62
+ readonly motion: ReducedMotionService;
63
+ readonly keyOf: (f: ChangedFile, h: Hunk, k: number) => string;
64
+ readonly ext: (name: string) => string;
65
+ /** Uncontrolled fallbacks; the matching @Input, when set, wins (controlled). */
66
+ private curInner;
67
+ private decInner;
68
+ /** Per-line comment boxes, by "<file>:<hunk>:<line>". */
69
+ boxes: Record<string, CommentBox>;
70
+ added: number;
71
+ removed: number;
72
+ private advance?;
73
+ ngOnChanges(changes: SimpleChanges): void;
74
+ private countChanges;
75
+ private get cur();
76
+ private get dec();
77
+ /** The clamped index of the shown file. */
78
+ get at(): number;
79
+ /** The shown file, or an empty stand-in while the list is empty. */
80
+ current(): ChangedFile;
81
+ defaultTitle(): string;
82
+ boxId(k: number, j: number): string;
83
+ decisionFor(f: ChangedFile, h: Hunk, k: number): HunkDecision | '';
84
+ fileState(x: ChangedFile): FileState;
85
+ /** Show file i; the diff's entrance replays through the fresh [animation-delay]. */
86
+ show(i: number): void;
87
+ private setDec;
88
+ decide(key: string, s: HunkDecision): void;
89
+ bulk(s: HunkDecision): void;
90
+ openComment(k: number, j: number): void;
91
+ send(id: string, h: Hunk, l: DiffLine): void;
92
+ closeComment(id: string): void;
93
+ ngOnDestroy(): void;
94
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChangeReviewComponent, never>;
95
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChangeReviewComponent, "vo-change-review", never, { "files": { "alias": "files"; "required": false; }; "file": { "alias": "file"; "required": false; }; "defaultFile": { "alias": "defaultFile"; "required": false; }; "decisions": { "alias": "decisions"; "required": false; }; "defaultDecisions": { "alias": "defaultDecisions"; "required": false; }; "title": { "alias": "title"; "required": false; }; }, { "fileChange": "fileChange"; "decisionsChange": "decisionsChange"; "comment": "comment"; }, never, never, true, never>;
96
+ }
97
+ export {};
@@ -0,0 +1,95 @@
1
+ import { AfterViewInit, ElementRef, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** One source behind a citation. */
4
+ export interface CitationHoverCardSource {
5
+ /** One or two letters on the source's coloured mark, like "B". */
6
+ mark: string;
7
+ /** The mark's colour, like '#4a5a8a' or 'var(--vo-pm)'. */
8
+ color: string;
9
+ /** Where it comes from, like "baymard.com" or "Drive". */
10
+ site: string;
11
+ title: string;
12
+ /** The passage the answer relies on. Wrap the part that matters in <mark>…</mark>. */
13
+ quote: string;
14
+ /** The quiet line in the corner, like "Read 4 days ago". */
15
+ meta?: string;
16
+ /** Opens in a new tab from the card's link. */
17
+ href?: string;
18
+ }
19
+ /** The parsed pieces of one paragraph: text runs and citation numbers. */
20
+ interface Part {
21
+ cite: boolean;
22
+ /** The text for a plain run, or the citation number for a cite. */
23
+ text: string;
24
+ /** The source index (number − 1) for a cite, or −1 when there is no such source. */
25
+ i: number;
26
+ }
27
+ /** The card kept on screen, with its restart key and placement. */
28
+ interface Shown {
29
+ i: number;
30
+ x: number;
31
+ y: number;
32
+ n: number;
33
+ }
34
+ /** An answer with numbered citations. Hovering, focusing or tapping one shows its source in a small card underneath. */
35
+ export declare class CitationHoverCardComponent implements AfterViewInit, OnChanges, OnDestroy {
36
+ /** The answer. `[n]` cites source n; a blank line starts a new paragraph. */
37
+ text: string;
38
+ sources: CitationHoverCardSource[];
39
+ /** The link in the card's corner. */
40
+ openLabel: string;
41
+ className?: string;
42
+ private _open;
43
+ /** Opens a source's card from outside (0 is the first source), or closes it with null. */
44
+ set open(v: number | null | undefined);
45
+ get open(): number | null | undefined;
46
+ /** Called when the card's link is clicked, with the source and its index. */
47
+ openSource: EventEmitter<{
48
+ source: CitationHoverCardSource;
49
+ index: number;
50
+ }>;
51
+ /** Called when a card opens or closes, with the source's index, or null. */
52
+ openChange: EventEmitter<number | null>;
53
+ boxRef: ElementRef<HTMLDivElement>;
54
+ cardRef: ElementRef<HTMLDivElement>;
55
+ /** Parsed paragraphs for the template. */
56
+ paragraphs: Part[][];
57
+ /** The card kept on screen, or null. */
58
+ at: Shown | null;
59
+ private cur;
60
+ private last;
61
+ private curEl;
62
+ private marks;
63
+ private showT?;
64
+ private hideT?;
65
+ private focusLink;
66
+ private back;
67
+ private ready;
68
+ private readonly onDown;
69
+ private readonly onKey;
70
+ private readonly onResize;
71
+ /** True while a card is shown (as opposed to fading out). */
72
+ get isOpen(): boolean;
73
+ /** The source whose content the card shows: the open one, or the last while it fades. */
74
+ get shownSource(): CitationHoverCardSource | undefined;
75
+ ngOnChanges(changes: SimpleChanges): void;
76
+ ngAfterViewInit(): void;
77
+ ngOnDestroy(): void;
78
+ private parse;
79
+ label(part: Part): string;
80
+ private show;
81
+ private hide;
82
+ private applyOpen;
83
+ enter(i: number, e: PointerEvent): void;
84
+ leave(e: PointerEvent): void;
85
+ onFocus(i: number, e: FocusEvent): void;
86
+ onBlur(e: FocusEvent): void;
87
+ onClick(i: number, e: MouseEvent): void;
88
+ cardEnter(): void;
89
+ cardLeave(e: PointerEvent): void;
90
+ cardFocusOut(e: FocusEvent): void;
91
+ follow(s: CitationHoverCardSource, e: MouseEvent): void;
92
+ static ɵfac: i0.ɵɵFactoryDeclaration<CitationHoverCardComponent, never>;
93
+ static ɵcmp: i0.ɵɵComponentDeclaration<CitationHoverCardComponent, "vo-citation-hover-card", never, { "text": { "alias": "text"; "required": false; }; "sources": { "alias": "sources"; "required": false; }; "openLabel": { "alias": "openLabel"; "required": false; }; "className": { "alias": "className"; "required": false; }; "open": { "alias": "open"; "required": false; }; }, { "openSource": "openSource"; "openChange": "openChange"; }, never, never, true, never>;
94
+ }
95
+ export {};
@@ -0,0 +1,86 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { ReducedMotionService } from '../core/reduced-motion.service';
3
+ import * as i0 from "@angular/core";
4
+ /** k keyword, s string, f function, cm comment, tg tag, at attribute. */
5
+ export type CodeToken = 'k' | 's' | 'f' | 'cm' | 'tg' | 'at';
6
+ /** Plain text, or `[token, text]` for a highlighted piece. */
7
+ export type CodePiece = string | [CodeToken, string];
8
+ /** One line of code, optionally changed by the agent and carrying a note. */
9
+ export interface CodeLine {
10
+ /** The line as plain text, or as pieces to highlight. */
11
+ code: string | CodePiece[];
12
+ /** The agent changed this line: its number turns green and the line gets a wash. */
13
+ changed?: boolean;
14
+ /** What the agent says about the line when you click it. */
15
+ note?: string;
16
+ }
17
+ /** One file shown on a tab. */
18
+ export interface CodeFile {
19
+ /** Shown on the tab, like "PlanCard.tsx". */
20
+ name: string;
21
+ lines: CodeLine[];
22
+ }
23
+ /** A rendered piece of a line: a class for a highlighted token, or '' for plain. */
24
+ interface Piece {
25
+ cls: string;
26
+ text: string;
27
+ }
28
+ /** The three phases a note moves through while it "reads" then answers. */
29
+ type NotePhase = 'reading' | 'out' | 'said';
30
+ export declare class CodeViewerComponent implements OnChanges, OnDestroy {
31
+ /** The files the agent changed. */
32
+ files: CodeFile[];
33
+ /** The open file, by name. Leave it out to let the tabs switch it. */
34
+ file?: string;
35
+ /** The file open at first when `file` is not controlled. */
36
+ defaultFile?: string;
37
+ /** Emitted with the name of the file the tabs switch to. */
38
+ fileChange: EventEmitter<string>;
39
+ /** The line whose note is open (0 is the first line), or null. Leave it out to let a click open it. */
40
+ line?: number | null;
41
+ /** The line open at first when `line` is not controlled. */
42
+ defaultLine: number | null;
43
+ /** Emitted with the line whose note opened, or null when it closed. */
44
+ lineChange: EventEmitter<number | null>;
45
+ /** How long a note says "Reading the line" before it answers, in ms. */
46
+ delay: number;
47
+ /** The note for a line the agent didn't change and has nothing to say about. */
48
+ unchangedNote: string;
49
+ /** Emitted with the file's text when it is copied. */
50
+ copy: EventEmitter<string>;
51
+ className: string;
52
+ readonly motion: ReducedMotionService;
53
+ /** The note's phase: reads for a moment, crossfades, then says what it knows. */
54
+ phase: NotePhase;
55
+ /** Whether the copy button is showing its "copied" check. */
56
+ copied: boolean;
57
+ private nameKey;
58
+ private openKey;
59
+ private timers;
60
+ ngOnChanges(changes: SimpleChanges): void;
61
+ /** The name of the open file. */
62
+ get name(): string;
63
+ /** The index of the open line, or null. */
64
+ get open(): number | null;
65
+ /** The open file, falling back to the first one. */
66
+ get cur(): CodeFile | undefined;
67
+ /** How many lines of the open file the agent changed. */
68
+ get changed(): number;
69
+ /** Track lines by the file name and index, so a new file remounts them. */
70
+ trackLine(k: number): string;
71
+ /** The highlighted pieces of a line, or an empty list for a blank line. */
72
+ pieces(code: CodeLine['code']): Piece[];
73
+ /** The text of a line's note, or the fallback for an unchanged line. */
74
+ noteText(l: CodeLine): string;
75
+ pick(n: string): void;
76
+ ask(k: number): void;
77
+ key(e: KeyboardEvent, k: number): void;
78
+ copyFile(): void;
79
+ private setOpen;
80
+ private startNote;
81
+ private clearTimers;
82
+ ngOnDestroy(): void;
83
+ static ɵfac: i0.ɵɵFactoryDeclaration<CodeViewerComponent, never>;
84
+ static ɵcmp: i0.ɵɵComponentDeclaration<CodeViewerComponent, "vo-code-viewer", never, { "files": { "alias": "files"; "required": false; }; "file": { "alias": "file"; "required": false; }; "defaultFile": { "alias": "defaultFile"; "required": false; }; "line": { "alias": "line"; "required": false; }; "defaultLine": { "alias": "defaultLine"; "required": false; }; "delay": { "alias": "delay"; "required": false; }; "unchangedNote": { "alias": "unchangedNote"; "required": false; }; "className": { "alias": "className"; "required": false; }; }, { "fileChange": "fileChange"; "lineChange": "lineChange"; "copy": "copy"; }, never, never, true, never>;
85
+ }
86
+ export {};
@@ -0,0 +1,114 @@
1
+ import { AfterViewInit, ElementRef, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import * as i0 from "@angular/core";
4
+ /** A file or frame added to the message, shown as a chip above the text. */
5
+ export interface ComposerAttachment {
6
+ key: string;
7
+ label: string;
8
+ /** Defaults to a paper clip. */
9
+ icon?: VoIconName;
10
+ /** loading shows a spinner and holds Send until it's ready; error shows the chip in red with a Try again button. */
11
+ status?: 'loading' | 'error' | 'ready';
12
+ }
13
+ /** An option in one of the composer's menus. */
14
+ export interface ComposerOption {
15
+ value: string;
16
+ /** Defaults to the value. */
17
+ label?: string;
18
+ /** The quiet line under the label. */
19
+ detail?: string;
20
+ icon?: VoIconName;
21
+ }
22
+ /** The message sent up when the person presses Send. */
23
+ export interface ComposerMessage {
24
+ text: string;
25
+ attachments: ComposerAttachment[];
26
+ }
27
+ type PopName = 'plus' | 'ctx' | 'mode';
28
+ export declare class ComposerComponent implements OnChanges, AfterViewInit, OnDestroy {
29
+ /** The text in the box. Leave it out (undefined) to let the composer keep it. */
30
+ value?: string;
31
+ defaultValue: string;
32
+ valueChange: EventEmitter<string>;
33
+ placeholder: string;
34
+ /** Emitted with the message when the person sends it. The box clears itself afterwards. */
35
+ send: EventEmitter<ComposerMessage>;
36
+ /** The agent is answering: send turns into stop. */
37
+ busy: boolean;
38
+ /** Emitted by the stop button while busy. */
39
+ stop: EventEmitter<void>;
40
+ /** Files and frames added to the message. Leave it out to let the composer keep them. */
41
+ attachments?: ComposerAttachment[];
42
+ defaultAttachments: ComposerAttachment[];
43
+ attachmentsChange: EventEmitter<ComposerAttachment[]>;
44
+ /** What the attach menu offers. Defaults to a file, a Figma frame and a screenshot. */
45
+ addOptions: ComposerOption[];
46
+ /** Emitted with the option's value when the person picks one from the attach menu. */
47
+ add: EventEmitter<string>;
48
+ /** Emitted by Try again on an attachment that failed to load. */
49
+ retry: EventEmitter<string>;
50
+ /** What the agent can work on. The chip only shows when there are some. */
51
+ contexts?: ComposerOption[];
52
+ context?: string;
53
+ defaultContext?: string;
54
+ contextChange: EventEmitter<string>;
55
+ /** What the agent may do. Defaults to Ask, Edit and Plan. */
56
+ modes: ComposerOption[];
57
+ mode?: string;
58
+ defaultMode?: string;
59
+ modeChange: EventEmitter<string>;
60
+ /** Emitted by the microphone button. The mic button only shows when dictate has a listener. */
61
+ dictate: EventEmitter<void>;
62
+ /** Swaps the toolbar for a red dot, a clock, Cancel and Done. */
63
+ dictating: boolean;
64
+ /** Seconds to show while dictating. Leave it out to let it count. */
65
+ dictationSeconds?: number;
66
+ /** Emitted by Cancel (false, text goes back) or Done (true, text stays). */
67
+ dictationEnd: EventEmitter<boolean>;
68
+ className: string;
69
+ box: ElementRef<HTMLDivElement>;
70
+ ta: ElementRef<HTMLTextAreaElement>;
71
+ popPlus?: ElementRef<HTMLDivElement>;
72
+ popCtx?: ElementRef<HTMLDivElement>;
73
+ popMode?: ElementRef<HTMLDivElement>;
74
+ private readonly motion;
75
+ private textState;
76
+ private filesState;
77
+ private ctxState;
78
+ private mdState;
79
+ pop: PopName | null;
80
+ leaving: string[];
81
+ counted: number;
82
+ get showDictate(): boolean;
83
+ get text(): string;
84
+ get files(): ComposerAttachment[];
85
+ get ctx(): string;
86
+ get md(): string;
87
+ private before;
88
+ private wasDictating;
89
+ private countTimer?;
90
+ private timers;
91
+ private onDocClick;
92
+ clock: (s: number) => string;
93
+ ngOnChanges(changes: SimpleChanges): void;
94
+ ngAfterViewInit(): void;
95
+ ngOnDestroy(): void;
96
+ ctxOpt(): ComposerOption | undefined;
97
+ mdOpt(): ComposerOption | undefined;
98
+ private grow;
99
+ onInput(e: Event): void;
100
+ onKey(e: KeyboardEvent): void;
101
+ canSend(): boolean;
102
+ submit(): void;
103
+ removeAttachment(key: string): void;
104
+ toggle(name: PopName): void;
105
+ choose(name: PopName, o: ComposerOption): void;
106
+ private syncDictation;
107
+ private syncCounter;
108
+ endDictation(keep: boolean): void;
109
+ private popEl;
110
+ private triggerContains;
111
+ static ɵfac: i0.ɵɵFactoryDeclaration<ComposerComponent, never>;
112
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComposerComponent, "vo-composer", never, { "value": { "alias": "value"; "required": false; }; "defaultValue": { "alias": "defaultValue"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; "attachments": { "alias": "attachments"; "required": false; }; "defaultAttachments": { "alias": "defaultAttachments"; "required": false; }; "addOptions": { "alias": "addOptions"; "required": false; }; "contexts": { "alias": "contexts"; "required": false; }; "context": { "alias": "context"; "required": false; }; "defaultContext": { "alias": "defaultContext"; "required": false; }; "modes": { "alias": "modes"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "defaultMode": { "alias": "defaultMode"; "required": false; }; "dictating": { "alias": "dictating"; "required": false; }; "dictationSeconds": { "alias": "dictationSeconds"; "required": false; }; "className": { "alias": "className"; "required": false; }; }, { "valueChange": "valueChange"; "send": "send"; "stop": "stop"; "attachmentsChange": "attachmentsChange"; "add": "add"; "retry": "retry"; "contextChange": "contextChange"; "modeChange": "modeChange"; "dictate": "dictate"; "dictationEnd": "dictationEnd"; }, never, ["*"], true, never>;
113
+ }
114
+ export {};
@@ -0,0 +1,60 @@
1
+ import { ElementRef, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** One kind of thing in the context. */
4
+ export interface ContextPart {
5
+ key: string;
6
+ /** Like "Files", "Tool output" or "Chat". */
7
+ label: string;
8
+ /** How many tokens it takes. */
9
+ tokens: number;
10
+ /** Its colour in the bar and the legend. Defaults to blue, teal, violet, grey. */
11
+ color?: string;
12
+ /** What is in it, shown on hover, like "PricingCard.tsx 18.2k, tokens.css 6.1k". */
13
+ items?: string;
14
+ }
15
+ export declare class ContextMeterComponent {
16
+ parts: ContextPart[];
17
+ /** The size of the context window, in tokens, like 200000. */
18
+ limit: number;
19
+ /** From this share of the limit (0 to 1) the ring turns orange. Defaults to 0.85. */
20
+ warnAt: number;
21
+ /** A line under the legend. Crossfades when it changes. */
22
+ message?: string;
23
+ /** warn shows the message in orange with a warning sign, ok in green with a check. */
24
+ messageTone: 'warn' | 'ok';
25
+ /** Set once the context is compacted: the button turns into Undo. */
26
+ compacted: boolean;
27
+ /** The quiet line beside the button. Defaults to what Compact does. */
28
+ hint: string;
29
+ /** Whether the panel is open. Leave it out to let the pill toggle it. */
30
+ open?: boolean;
31
+ /** Shows the footer with the Compact / Undo button. */
32
+ showCompact: boolean;
33
+ /** Called by Compact. Return nothing or a promise; the button spins until it settles. */
34
+ compact: EventEmitter<void>;
35
+ undo: EventEmitter<void>;
36
+ openChange: EventEmitter<boolean>;
37
+ root?: ElementRef<HTMLDivElement>;
38
+ toggle?: ElementRef<HTMLButtonElement>;
39
+ /** Which legend row is lit (its share of the bar is highlighted). */
40
+ lit: string | null;
41
+ /** True while a compact run is in flight (shows the spinner). */
42
+ busy: boolean;
43
+ private innerOpen;
44
+ get isOpen(): boolean;
45
+ get total(): number;
46
+ get share(): number;
47
+ get pct(): number;
48
+ get totK(): string;
49
+ get limitK(): string;
50
+ get showFooter(): boolean;
51
+ palette(i: number): string;
52
+ partK(p: ContextPart): string;
53
+ setOpen(o: boolean): void;
54
+ onCompactClick(): void;
55
+ /** Call from the host when a compact run begins/ends, to show the spinner. */
56
+ setBusy(b: boolean): void;
57
+ onKeydown(e: KeyboardEvent): void;
58
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContextMeterComponent, never>;
59
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContextMeterComponent, "vo-context-meter", never, { "parts": { "alias": "parts"; "required": false; }; "limit": { "alias": "limit"; "required": false; }; "warnAt": { "alias": "warnAt"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messageTone": { "alias": "messageTone"; "required": false; }; "compacted": { "alias": "compacted"; "required": false; }; "hint": { "alias": "hint"; "required": false; }; "open": { "alias": "open"; "required": false; }; "showCompact": { "alias": "showCompact"; "required": false; }; }, { "compact": "compact"; "undo": "undo"; "openChange": "openChange"; }, never, never, true, never>;
60
+ }
@@ -0,0 +1,10 @@
1
+ import * as i0 from "@angular/core";
2
+ export type VoIconName = 'minus' | 'plus' | 'x' | 'check' | 'chev-r' | 'chev-l' | 'chev-d' | 'chev-u' | 'spark' | 'lock' | 'copy' | 'play' | 'pause' | 'refresh' | 'ok' | 'alert' | 'warn' | 'info' | 'clock' | 'eye' | 'search' | 'users' | 'coins' | 'ext' | 'undo' | 'redo' | 'stop' | 'trash' | 'edit' | 'more' | 'comment' | 'file-text' | 'term' | 'pr' | 'figma' | 'globe' | 'cpu' | 'hand';
3
+ export declare class VoIconComponent {
4
+ name: VoIconName;
5
+ size: 'xs' | 'sm' | 'md' | 'lg';
6
+ get px(): number;
7
+ get markup(): string;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<VoIconComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<VoIconComponent, "vo-icon", never, { "name": { "alias": "name"; "required": true; }; "size": { "alias": "size"; "required": false; }; }, {}, never, never, true, never>;
10
+ }
@@ -0,0 +1,15 @@
1
+ import { OnDestroy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ReducedMotionService implements OnDestroy {
4
+ /** Reactive signal: true when the user prefers reduced motion. */
5
+ readonly prefersReduced: import("@angular/core").WritableSignal<boolean>;
6
+ private mq;
7
+ private readonly onChange;
8
+ constructor();
9
+ /** Imperative access for setup code outside the template. */
10
+ reduce(): boolean;
11
+ private query;
12
+ ngOnDestroy(): void;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReducedMotionService, never>;
14
+ static ɵprov: i0.ɵɵInjectableDeclaration<ReducedMotionService>;
15
+ }
@@ -0,0 +1,56 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** One option in a question: its label and an optional quiet detail at the end of the row. */
4
+ export interface DecisionOption {
5
+ label: string;
6
+ /** Quiet text at the end of the row, like "3 frames" or "Recommended". */
7
+ detail?: string;
8
+ }
9
+ /** One question the agent asks, with a short name for the summary and its options. */
10
+ export interface DecisionQuestion {
11
+ question: string;
12
+ /** A short name for the question in the summary, like "Scope". */
13
+ label: string;
14
+ options: DecisionOption[];
15
+ }
16
+ /** The agent asks a few quick questions before it starts. Number keys pick, Enter continues. */
17
+ export declare class DecisionPromptComponent implements OnChanges {
18
+ /** The questions the agent asks, in order. */
19
+ questions: DecisionQuestion[];
20
+ /** The answers so far, an option's index or null for a skipped question. Leave it out to let Continue and Skip fill it. */
21
+ answers?: (number | null)[];
22
+ /** The answers the prompt starts with when uncontrolled. */
23
+ defaultAnswers: (number | null)[];
24
+ /** What the summary says for a skipped question. */
25
+ skippedLabel: string;
26
+ /** The line under the summary while the agent gets going. */
27
+ startLabel: string;
28
+ /** The agent has got going: the line under the summary settles with a check. */
29
+ started: boolean;
30
+ /** What that line says once started. Defaults to startLabel. */
31
+ startedLabel?: string;
32
+ /** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
33
+ bare: boolean;
34
+ /** Emitted whenever the answers change (a pick, or a skip). */
35
+ answersChange: EventEmitter<(number | null)[]>;
36
+ /** Emitted once every question is answered, with the picked option's index for each, or null where the person skipped. */
37
+ complete: EventEmitter<(number | null)[]>;
38
+ /** The highlighted option for the current question. */
39
+ sel: number;
40
+ private internal;
41
+ ngOnChanges(changes: SimpleChanges): void;
42
+ private get list();
43
+ /** How many questions there are. */
44
+ get n(): number;
45
+ /** How many have been answered so far. */
46
+ get at(): number;
47
+ /** Every question has an answer. */
48
+ get done(): boolean;
49
+ /** The question being asked now. */
50
+ get current(): DecisionQuestion;
51
+ summaryAnswer(i: number): string;
52
+ next(skipped?: boolean): void;
53
+ onKey(e: KeyboardEvent): void;
54
+ static ɵfac: i0.ɵɵFactoryDeclaration<DecisionPromptComponent, never>;
55
+ static ɵcmp: i0.ɵɵComponentDeclaration<DecisionPromptComponent, "vo-decision-prompt", never, { "questions": { "alias": "questions"; "required": false; }; "answers": { "alias": "answers"; "required": false; }; "defaultAnswers": { "alias": "defaultAnswers"; "required": false; }; "skippedLabel": { "alias": "skippedLabel"; "required": false; }; "startLabel": { "alias": "startLabel"; "required": false; }; "started": { "alias": "started"; "required": false; }; "startedLabel": { "alias": "startedLabel"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, { "answersChange": "answersChange"; "complete": "complete"; }, never, never, true, never>;
56
+ }