@joewinke/jatui 0.1.25 → 0.1.26

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 (242) hide show
  1. package/dist/actions/collapse.d.ts +80 -0
  2. package/dist/actions/collapse.js +134 -0
  3. package/dist/actions/railNav.d.ts +167 -0
  4. package/dist/actions/railNav.js +351 -0
  5. package/dist/components/AnnotationLayer.svelte +108 -0
  6. package/dist/components/AnnotationLayer.svelte.d.ts +12 -0
  7. package/dist/components/AnnotationPanel.svelte +319 -0
  8. package/dist/components/AnnotationPanel.svelte.d.ts +13 -0
  9. package/dist/components/AudioWaveform.svelte +701 -0
  10. package/dist/components/AudioWaveform.svelte.d.ts +19 -0
  11. package/dist/components/AvailabilityModal.svelte +177 -0
  12. package/dist/components/AvailabilityModal.svelte.d.ts +14 -0
  13. package/dist/components/AvatarUpload.svelte +234 -0
  14. package/dist/components/AvatarUpload.svelte.d.ts +23 -0
  15. package/dist/components/Badge.svelte +38 -0
  16. package/dist/components/Badge.svelte.d.ts +14 -0
  17. package/dist/components/BookingForm.svelte +278 -0
  18. package/dist/components/BookingForm.svelte.d.ts +37 -0
  19. package/dist/components/BurndownChart.svelte +778 -0
  20. package/dist/components/BurndownChart.svelte.d.ts +17 -0
  21. package/dist/components/Button.svelte +81 -0
  22. package/dist/components/Button.svelte.d.ts +21 -0
  23. package/dist/components/CalendarPicker.svelte +284 -0
  24. package/dist/components/CalendarPicker.svelte.d.ts +22 -0
  25. package/dist/components/Card.svelte +67 -0
  26. package/dist/components/Card.svelte.d.ts +17 -0
  27. package/dist/components/CharacterCounter.svelte +82 -0
  28. package/dist/components/CharacterCounter.svelte.d.ts +10 -0
  29. package/dist/components/ChipInput.svelte +609 -0
  30. package/dist/components/ChipInput.svelte.d.ts +55 -0
  31. package/dist/components/Collapse.svelte +91 -0
  32. package/dist/components/Collapse.svelte.d.ts +18 -0
  33. package/dist/components/ColorSelector.svelte +167 -0
  34. package/dist/components/ColorSelector.svelte.d.ts +9 -0
  35. package/dist/components/CommentThread.svelte +773 -0
  36. package/dist/components/CommentThread.svelte.d.ts +32 -0
  37. package/dist/components/ConfirmDialog.svelte +348 -0
  38. package/dist/components/ConfirmDialog.svelte.d.ts +3 -0
  39. package/dist/components/ConfirmModal.svelte +142 -0
  40. package/dist/components/ConfirmModal.svelte.d.ts +15 -0
  41. package/dist/components/ContextMenu.svelte +188 -0
  42. package/dist/components/ContextMenu.svelte.d.ts +31 -0
  43. package/dist/components/CountdownTimer.svelte +94 -0
  44. package/dist/components/CountdownTimer.svelte.d.ts +10 -0
  45. package/dist/components/DateRangePicker.svelte +194 -0
  46. package/dist/components/DateRangePicker.svelte.d.ts +10 -0
  47. package/dist/components/Drawer.svelte +143 -0
  48. package/dist/components/Drawer.svelte.d.ts +33 -0
  49. package/dist/components/EmojiPicker.svelte +159 -0
  50. package/dist/components/EmojiPicker.svelte.d.ts +8 -0
  51. package/dist/components/EntityPreviewCard.svelte +104 -0
  52. package/dist/components/EntityPreviewCard.svelte.d.ts +9 -0
  53. package/dist/components/FileDropzone.svelte +493 -0
  54. package/dist/components/FileDropzone.svelte.d.ts +40 -0
  55. package/dist/components/FilePicker.svelte +488 -0
  56. package/dist/components/FilePicker.svelte.d.ts +20 -0
  57. package/dist/components/FileThumbnail.svelte +80 -0
  58. package/dist/components/FileThumbnail.svelte.d.ts +12 -0
  59. package/dist/components/FilterDropdown.svelte +203 -0
  60. package/dist/components/FilterDropdown.svelte.d.ts +48 -0
  61. package/dist/components/FloatingActionBar.svelte +354 -0
  62. package/dist/components/FloatingActionBar.svelte.d.ts +51 -0
  63. package/dist/components/GPSTracker.svelte +202 -0
  64. package/dist/components/GPSTracker.svelte.d.ts +34 -0
  65. package/dist/components/HunkDiffView.svelte +348 -0
  66. package/dist/components/HunkDiffView.svelte.d.ts +9 -0
  67. package/dist/components/ImageLightbox.svelte +274 -0
  68. package/dist/components/ImageLightbox.svelte.d.ts +25 -0
  69. package/dist/components/ImageUpload.svelte +147 -0
  70. package/dist/components/ImageUpload.svelte.d.ts +10 -0
  71. package/dist/components/InlineEdit.svelte +291 -0
  72. package/dist/components/InlineEdit.svelte.d.ts +45 -0
  73. package/dist/components/InputDialog.svelte +327 -0
  74. package/dist/components/InputDialog.svelte.d.ts +3 -0
  75. package/dist/components/KeyboardShortcutsOverlay.svelte +296 -0
  76. package/dist/components/KeyboardShortcutsOverlay.svelte.d.ts +42 -0
  77. package/dist/components/LazyImage.svelte +123 -0
  78. package/dist/components/LazyImage.svelte.d.ts +14 -0
  79. package/dist/components/LinkShortener.svelte +274 -0
  80. package/dist/components/LinkShortener.svelte.d.ts +27 -0
  81. package/dist/components/LoadingSpinner.svelte +106 -0
  82. package/dist/components/LoadingSpinner.svelte.d.ts +21 -0
  83. package/dist/components/LocationMap.svelte +186 -0
  84. package/dist/components/LocationMap.svelte.d.ts +11 -0
  85. package/dist/components/MapView.svelte +341 -0
  86. package/dist/components/MapView.svelte.d.ts +20 -0
  87. package/dist/components/MarkupEditor.svelte +485 -0
  88. package/dist/components/MarkupEditor.svelte.d.ts +10 -0
  89. package/dist/components/MarkupOverlay.svelte +55 -0
  90. package/dist/components/MarkupOverlay.svelte.d.ts +8 -0
  91. package/dist/components/MediaWorkbench.svelte +871 -0
  92. package/dist/components/MediaWorkbench.svelte.d.ts +9 -0
  93. package/dist/components/MilestoneCard.svelte +98 -0
  94. package/dist/components/MilestoneCard.svelte.d.ts +16 -0
  95. package/dist/components/MilestoneTimeline.svelte +91 -0
  96. package/dist/components/MilestoneTimeline.svelte.d.ts +15 -0
  97. package/dist/components/Modal.svelte +244 -0
  98. package/dist/components/Modal.svelte.d.ts +35 -0
  99. package/dist/components/PDFViewer.svelte +105 -0
  100. package/dist/components/PDFViewer.svelte.d.ts +9 -0
  101. package/dist/components/PdfThumbnail.svelte +63 -0
  102. package/dist/components/PdfThumbnail.svelte.d.ts +9 -0
  103. package/dist/components/PhoneInput.svelte +212 -0
  104. package/dist/components/PhoneInput.svelte.d.ts +25 -0
  105. package/dist/components/ResizableDivider.svelte +307 -0
  106. package/dist/components/ResizableDivider.svelte.d.ts +26 -0
  107. package/dist/components/ResizablePanel.svelte +305 -0
  108. package/dist/components/ResizablePanel.svelte.d.ts +18 -0
  109. package/dist/components/SearchDropdown.svelte +421 -0
  110. package/dist/components/SearchDropdown.svelte.d.ts +24 -0
  111. package/dist/components/SelectInput.svelte +237 -0
  112. package/dist/components/SelectInput.svelte.d.ts +26 -0
  113. package/dist/components/SidebarUserFooter.svelte +34 -0
  114. package/dist/components/SidebarUserFooter.svelte.d.ts +16 -0
  115. package/dist/components/SignaturePad.svelte +175 -0
  116. package/dist/components/SignaturePad.svelte.d.ts +17 -0
  117. package/dist/components/SmartImageEditor.svelte +720 -0
  118. package/dist/components/SmartImageEditor.svelte.d.ts +24 -0
  119. package/dist/components/SortDropdown.svelte +156 -0
  120. package/dist/components/SortDropdown.svelte.d.ts +40 -0
  121. package/dist/components/Sparkline.svelte +116 -0
  122. package/dist/components/Sparkline.svelte.d.ts +12 -0
  123. package/dist/components/SpeechForm.svelte +114 -0
  124. package/dist/components/SpeechForm.svelte.d.ts +17 -0
  125. package/dist/components/StatusBadge.svelte +157 -0
  126. package/dist/components/StatusBadge.svelte.d.ts +24 -0
  127. package/dist/components/TaskTypeIcon.svelte +54 -0
  128. package/dist/components/TaskTypeIcon.svelte.d.ts +17 -0
  129. package/dist/components/TextArea.svelte +162 -0
  130. package/dist/components/TextArea.svelte.d.ts +30 -0
  131. package/dist/components/TextInput.svelte +131 -0
  132. package/dist/components/TextInput.svelte.d.ts +29 -0
  133. package/dist/components/ThemeSelector.svelte +206 -0
  134. package/dist/components/ThemeSelector.svelte.d.ts +14 -0
  135. package/dist/components/TimeSlotPicker.svelte +162 -0
  136. package/dist/components/TimeSlotPicker.svelte.d.ts +18 -0
  137. package/dist/components/UserAvatar.svelte +72 -0
  138. package/dist/components/UserAvatar.svelte.d.ts +11 -0
  139. package/dist/components/VariablePicker.svelte +170 -0
  140. package/dist/components/VariablePicker.svelte.d.ts +40 -0
  141. package/dist/components/VoicePlayer.svelte +422 -0
  142. package/dist/components/VoicePlayer.svelte.d.ts +18 -0
  143. package/dist/components/linked-columns/LinkedColumns.svelte +526 -0
  144. package/dist/components/linked-columns/LinkedColumns.svelte.d.ts +130 -0
  145. package/dist/components/markup.d.ts +47 -0
  146. package/dist/components/markup.js +201 -0
  147. package/dist/components/messaging/Avatar.svelte +81 -0
  148. package/dist/components/messaging/Avatar.svelte.d.ts +11 -0
  149. package/dist/components/messaging/ChannelInfoModal.svelte +163 -0
  150. package/dist/components/messaging/ChannelInfoModal.svelte.d.ts +18 -0
  151. package/dist/components/messaging/ChannelList.svelte +107 -0
  152. package/dist/components/messaging/ChannelList.svelte.d.ts +11 -0
  153. package/dist/components/messaging/ChannelMemberAvatarStack.svelte +69 -0
  154. package/dist/components/messaging/ChannelMemberAvatarStack.svelte.d.ts +11 -0
  155. package/dist/components/messaging/ChannelMembersModal.svelte +182 -0
  156. package/dist/components/messaging/ChannelMembersModal.svelte.d.ts +16 -0
  157. package/dist/components/messaging/CreateChannelModal.svelte +190 -0
  158. package/dist/components/messaging/CreateChannelModal.svelte.d.ts +14 -0
  159. package/dist/components/messaging/DirectMessageList.svelte +145 -0
  160. package/dist/components/messaging/DirectMessageList.svelte.d.ts +12 -0
  161. package/dist/components/messaging/EmojiSelector.svelte +261 -0
  162. package/dist/components/messaging/EmojiSelector.svelte.d.ts +19 -0
  163. package/dist/components/messaging/MentionAutocomplete.svelte +193 -0
  164. package/dist/components/messaging/MentionAutocomplete.svelte.d.ts +17 -0
  165. package/dist/components/messaging/MessageAttachment.svelte +273 -0
  166. package/dist/components/messaging/MessageAttachment.svelte.d.ts +13 -0
  167. package/dist/components/messaging/MessageAttachmentUpload.svelte +243 -0
  168. package/dist/components/messaging/MessageAttachmentUpload.svelte.d.ts +19 -0
  169. package/dist/components/messaging/MessageInput.svelte +452 -0
  170. package/dist/components/messaging/MessageInput.svelte.d.ts +28 -0
  171. package/dist/components/messaging/MessageItem.svelte +341 -0
  172. package/dist/components/messaging/MessageItem.svelte.d.ts +41 -0
  173. package/dist/components/messaging/MessageThread.svelte +306 -0
  174. package/dist/components/messaging/MessageThread.svelte.d.ts +30 -0
  175. package/dist/components/messaging/NotificationSettingsModal.svelte +234 -0
  176. package/dist/components/messaging/NotificationSettingsModal.svelte.d.ts +13 -0
  177. package/dist/components/messaging/QuotedMessageDisplay.svelte +123 -0
  178. package/dist/components/messaging/QuotedMessageDisplay.svelte.d.ts +10 -0
  179. package/dist/components/messaging/StartDMModal.svelte +100 -0
  180. package/dist/components/messaging/StartDMModal.svelte.d.ts +14 -0
  181. package/dist/components/messaging/ThreadPanel.svelte +153 -0
  182. package/dist/components/messaging/ThreadPanel.svelte.d.ts +16 -0
  183. package/dist/components/pipeline/DESIGN.md +361 -0
  184. package/dist/components/pipeline/Pipeline.svelte +391 -0
  185. package/dist/components/pipeline/Pipeline.svelte.d.ts +28 -0
  186. package/dist/components/pipeline/PipelineCard.svelte +94 -0
  187. package/dist/components/pipeline/PipelineCard.svelte.d.ts +13 -0
  188. package/dist/components/pipeline/PipelineColumn.svelte +163 -0
  189. package/dist/components/pipeline/PipelineColumn.svelte.d.ts +30 -0
  190. package/dist/components/replay/ChapterTimeline.svelte +326 -0
  191. package/dist/components/replay/ChapterTimeline.svelte.d.ts +39 -0
  192. package/dist/components/session-nav/transcriptModel.d.ts +132 -0
  193. package/dist/components/session-nav/transcriptModel.js +285 -0
  194. package/dist/data/emojis.d.ts +18 -0
  195. package/dist/data/emojis.js +1196 -0
  196. package/dist/index.d.ts +142 -0
  197. package/dist/index.js +142 -0
  198. package/dist/stores/confirmDialog.svelte.d.ts +21 -0
  199. package/dist/stores/confirmDialog.svelte.js +31 -0
  200. package/dist/stores/inputDialog.svelte.d.ts +24 -0
  201. package/dist/stores/inputDialog.svelte.js +32 -0
  202. package/dist/styles/rail.css +63 -0
  203. package/dist/types/annotation.d.ts +32 -0
  204. package/dist/types/annotation.js +3 -0
  205. package/dist/types/booking.d.ts +115 -0
  206. package/dist/types/booking.js +24 -0
  207. package/dist/types/comments.d.ts +65 -0
  208. package/dist/types/comments.js +22 -0
  209. package/dist/types/entityPreview.d.ts +42 -0
  210. package/dist/types/entityPreview.js +10 -0
  211. package/dist/types/filePicker.d.ts +15 -0
  212. package/dist/types/filePicker.js +1 -0
  213. package/dist/types/googleMaps.d.ts +51 -0
  214. package/dist/types/maps.d.ts +43 -0
  215. package/dist/types/maps.js +4 -0
  216. package/dist/types/messaging.d.ts +282 -0
  217. package/dist/types/messaging.js +100 -0
  218. package/dist/types/milestone.d.ts +20 -0
  219. package/dist/types/milestone.js +7 -0
  220. package/dist/types/pipeline.d.ts +115 -0
  221. package/dist/types/pipeline.js +15 -0
  222. package/dist/types/smartImageEditor.d.ts +42 -0
  223. package/dist/types/smartImageEditor.js +1 -0
  224. package/dist/types/templateVars.d.ts +34 -0
  225. package/dist/types/templateVars.js +12 -0
  226. package/dist/utils/currency.d.ts +8 -0
  227. package/dist/utils/currency.js +17 -0
  228. package/dist/utils/daisyuiColors.d.ts +37 -0
  229. package/dist/utils/daisyuiColors.js +152 -0
  230. package/dist/utils/dateFormatters.d.ts +69 -0
  231. package/dist/utils/dateFormatters.js +199 -0
  232. package/dist/utils/googleMapsLoader.d.ts +19 -0
  233. package/dist/utils/googleMapsLoader.js +121 -0
  234. package/dist/utils/mentionParser.d.ts +67 -0
  235. package/dist/utils/mentionParser.js +132 -0
  236. package/dist/utils/phone.d.ts +13 -0
  237. package/dist/utils/phone.js +67 -0
  238. package/dist/utils/phoneFormat.d.ts +26 -0
  239. package/dist/utils/phoneFormat.js +69 -0
  240. package/dist/utils/taskUtils.d.ts +37 -0
  241. package/dist/utils/taskUtils.js +71 -0
  242. package/package.json +3 -2
@@ -0,0 +1,285 @@
1
+ /**
2
+ * transcriptModel.ts — transcript → linked (transcript items ↔ signal nodes) model
3
+ * for the session navigator. Extracted from sankey/sankeyData.ts (jat-w8tgz.1).
4
+ *
5
+ * THE CONCEPT (from ~/Documents/many_to_one.mp4): a two-column linked view like
6
+ * an academic article + its citations. LEFT = the session transcript (prose),
7
+ * RIGHT = the signal events (the "references"). Curved ribbons connect spans of
8
+ * the transcript to the signal they produced, and ink up as you scroll/hover.
9
+ *
10
+ * THE ANCHORING TRICK: a JAT agent emits state by running `jat-signal <type> …`,
11
+ * which appears in Claude's transcript as a Bash tool call. So we scan the
12
+ * transcript for those calls and treat each as a signal-emission boundary. Each
13
+ * signal then "owns" the run of transcript that led up to it — the genuine
14
+ * many-to-one mapping. The jat-signal lines themselves are plumbing, so we
15
+ * consume them as boundaries and do NOT render them.
16
+ *
17
+ * COMPACTION: raw transcript lines are noisy (every tool result, every "file
18
+ * updated successfully" notice). We group lines into ITEMS:
19
+ * - prompt — a user message (shown in full; it's the human's intent)
20
+ * - assistant — the agent's prose (shown in full; it's the narrative)
21
+ * - action — a tool call, with its result body tucked into `detail` so the
22
+ * transcript shows just the headline by default and the body is
23
+ * a drill-down. This is what keeps the left column readable.
24
+ */
25
+ var __assign = (this && this.__assign) || function () {
26
+ __assign = Object.assign || function(t) {
27
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
28
+ s = arguments[i];
29
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
30
+ t[p] = s[p];
31
+ }
32
+ return t;
33
+ };
34
+ return __assign.apply(this, arguments);
35
+ };
36
+ export function rawTypeToState(raw) {
37
+ switch (raw) {
38
+ case 'needs_input':
39
+ return 'needs-input';
40
+ case 'review':
41
+ return 'ready-for-review';
42
+ case 'complete':
43
+ case 'completed':
44
+ return 'completed';
45
+ default:
46
+ return raw; // starting, working, completing, paused, idle pass through
47
+ }
48
+ }
49
+ /** Detect a `jat-signal <type> '<json>'` invocation in a tool-call body. */
50
+ function parseSignalBody(body) {
51
+ var m = body.match(/jat-signal\s+(starting|working|needs_input|review|completing|complete|completed|paused|idle)\b/);
52
+ if (!m)
53
+ return null;
54
+ var label = '';
55
+ var pick = body.match(/"(?:approach|question|reviewFocus|currentStep|summary|reason|taskTitle)"\s*:\s*"([^"]{3,90})/);
56
+ if (pick)
57
+ label = pick[1];
58
+ return { rawType: m[1], label: label };
59
+ }
60
+ /** Build the linked model from rendered transcript lines. */
61
+ export function buildLinkedSession(lines) {
62
+ var items = [];
63
+ var emits = [];
64
+ var cur = null;
65
+ var flush = function () {
66
+ if (cur) {
67
+ items.push(__assign(__assign({ id: items.length }, cur), { signalId: null }));
68
+ cur = null;
69
+ }
70
+ };
71
+ for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
72
+ var line = lines_1[_i];
73
+ if (!line.trim()) {
74
+ flush();
75
+ continue;
76
+ } // blank ends a block
77
+ if (line.startsWith('› ')) {
78
+ flush();
79
+ cur = { kind: 'prompt', headline: line.slice(2), detail: [], srcLines: 1 };
80
+ continue;
81
+ }
82
+ if (line.startsWith('⏺ ')) {
83
+ var body = line.slice(2);
84
+ var sig = parseSignalBody(body);
85
+ if (sig) {
86
+ // signal emission = boundary; consume it, don't render as an item
87
+ flush();
88
+ emits.push({ afterIdx: items.length - 1, rawType: sig.rawType, label: sig.label });
89
+ continue;
90
+ }
91
+ flush();
92
+ cur = { kind: 'action', headline: body, detail: [], srcLines: 1 };
93
+ continue;
94
+ }
95
+ if (line.startsWith(' ⎿ ')) {
96
+ var body = line.slice(4);
97
+ if (cur) {
98
+ cur.detail.push(body);
99
+ cur.srcLines++;
100
+ }
101
+ continue;
102
+ }
103
+ if (line.startsWith(' ')) {
104
+ // continuation: tool detail for actions, prose for prompt/assistant
105
+ var body = line.trimStart();
106
+ if (cur && cur.kind === 'action') {
107
+ cur.detail.push(body);
108
+ cur.srcLines++;
109
+ }
110
+ else if (cur) {
111
+ cur.headline += '\n' + body;
112
+ cur.srcLines++;
113
+ }
114
+ continue;
115
+ }
116
+ // plain assistant prose
117
+ if (cur && cur.kind === 'assistant') {
118
+ cur.headline += '\n' + line;
119
+ cur.srcLines++;
120
+ }
121
+ else {
122
+ flush();
123
+ cur = { kind: 'assistant', headline: line, detail: [], srcLines: 1 };
124
+ }
125
+ }
126
+ flush();
127
+ // Build signal nodes from emission boundaries.
128
+ var signals = [];
129
+ var prevBoundary = -1;
130
+ emits.forEach(function (e, i) {
131
+ var rowStart = Math.max(0, prevBoundary + 1);
132
+ var rowEnd = Math.max(rowStart, e.afterIdx);
133
+ var lineCount = 0;
134
+ for (var k = rowStart; k <= rowEnd && k < items.length; k++)
135
+ lineCount += items[k].srcLines;
136
+ signals.push({
137
+ id: "sig-".concat(i),
138
+ state: rawTypeToState(e.rawType),
139
+ rawType: e.rawType,
140
+ label: e.label,
141
+ rowStart: rowStart,
142
+ rowEnd: rowEnd,
143
+ lineCount: Math.max(1, lineCount),
144
+ // No WorkBlock substrate data in the raw-lines path
145
+ blockId: null,
146
+ summary: null,
147
+ filesTouched: [],
148
+ commits: [],
149
+ linesAdded: 0,
150
+ linesRemoved: 0
151
+ });
152
+ prevBoundary = e.afterIdx;
153
+ });
154
+ for (var _a = 0, signals_1 = signals; _a < signals_1.length; _a++) {
155
+ var sig = signals_1[_a];
156
+ for (var k = sig.rowStart; k <= sig.rowEnd && k < items.length; k++) {
157
+ items[k].signalId = sig.id;
158
+ }
159
+ }
160
+ return { items: items, signals: signals };
161
+ }
162
+ /**
163
+ * Build a LinkedSession from the WorkBlock substrate (B1).
164
+ *
165
+ * This is the preferred path for live sessions — it uses the richer data from
166
+ * `getSessionWork` (A1) including per-block summaries (A2) and file lists (A3)
167
+ * instead of re-parsing transcript lines.
168
+ *
169
+ * The `items` array from the server is used directly as `TranscriptItem[]` since
170
+ * both shapes share `id`, `kind`, `headline`, `detail`, `srcLines` with the
171
+ * `signalId` replaced by `blockId → signalId` mapping done here.
172
+ *
173
+ * @param blocks WorkBlock array from `/api/work/[sessionId]/navigator`
174
+ * @param items WorkTranscriptItem array from the same endpoint
175
+ */
176
+ export function buildLinkedSessionFromWork(blocks, items) {
177
+ // Map WorkTranscriptItem → TranscriptItem (blockId → signalId mapping happens after)
178
+ var transcriptItems = items.map(function (it) { return ({
179
+ id: it.id,
180
+ kind: it.kind,
181
+ headline: it.headline,
182
+ detail: it.detail,
183
+ srcLines: it.srcLines,
184
+ signalId: null // filled in below
185
+ }); });
186
+ // Map WorkBlock → SignalNode
187
+ var signals = blocks.map(function (blk) {
188
+ var _a, _b, _c;
189
+ return ({
190
+ id: blk.id,
191
+ state: rawTypeToState(blk.signal.type),
192
+ rawType: blk.signal.type,
193
+ label: blk.signal.label,
194
+ rowStart: blk.itemRange.start,
195
+ rowEnd: blk.itemRange.end,
196
+ lineCount: blk.lineCount,
197
+ // WorkBlock substrate fields
198
+ blockId: blk.id,
199
+ summary: blk.summary,
200
+ filesTouched: blk.filesTouched,
201
+ commits: (_a = blk.commits) !== null && _a !== void 0 ? _a : [],
202
+ linesAdded: (_b = blk.linesAdded) !== null && _b !== void 0 ? _b : 0,
203
+ linesRemoved: (_c = blk.linesRemoved) !== null && _c !== void 0 ? _c : 0
204
+ });
205
+ });
206
+ // Assign signalId to transcript items via block ownership
207
+ for (var _i = 0, signals_2 = signals; _i < signals_2.length; _i++) {
208
+ var sig = signals_2[_i];
209
+ for (var k = sig.rowStart; k <= sig.rowEnd && k < transcriptItems.length; k++) {
210
+ transcriptItems[k].signalId = sig.id;
211
+ }
212
+ }
213
+ return { items: transcriptItems, signals: signals };
214
+ }
215
+ /**
216
+ * A baked, realistic sample so /sankey always demos beautifully even with no live
217
+ * session. Authored as raw transcript lines with real `jat-signal` calls, so it
218
+ * flows through the EXACT same parser as live data.
219
+ */
220
+ export var SAMPLE_TRANSCRIPT_LINES = [
221
+ '',
222
+ '› /jat:start GentleCoast jat-7h2k',
223
+ '⏺ Bash(get-current-session-id)',
224
+ ' ⎿ 4f9c1a2e-7b3d-4c8a-9e1f-2a6b8c0d4e5f',
225
+ '⏺ Bash(jat-signal starting \'{"agentName":"GentleCoast","taskTitle":"Add password reset flow"}\')',
226
+ ' ⎿ Signal: starting (agent: GentleCoast, task: jat-7h2k)',
227
+ '',
228
+ 'I\'ll implement the password reset flow. Let me first read the existing auth module',
229
+ 'to understand the current login + token handling before adding the reset endpoints.',
230
+ '⏺ Read(src/lib/auth/login.ts)',
231
+ ' ⎿ export async function login(email, password) {',
232
+ ' const user = await findUser(email);',
233
+ ' … +48 more lines',
234
+ '⏺ Read(src/lib/auth/tokens.ts)',
235
+ ' ⎿ export function signToken(payload) {',
236
+ ' return jwt.sign(payload, SECRET, { expiresIn: \'15m\' });',
237
+ ' … +22 more lines',
238
+ '⏺ Bash(jat-signal working \'{"taskId":"jat-7h2k","approach":"Add reset-request + reset-confirm endpoints, reuse signToken with a short-lived scope"}\')',
239
+ ' ⎿ Signal: working (task: jat-7h2k)',
240
+ '',
241
+ 'The token helper already supports short expiries. I\'ll add a reset-scoped token',
242
+ 'and two endpoints: one to request a reset email, one to confirm with the token.',
243
+ '⏺ Write(src/routes/api/auth/reset-request/+server.ts)',
244
+ ' ⎿ Wrote 41 lines',
245
+ '⏺ Write(src/routes/api/auth/reset-confirm/+server.ts)',
246
+ ' ⎿ Wrote 56 lines',
247
+ '⏺ Edit(src/lib/auth/tokens.ts)',
248
+ ' ⎿ Added signResetToken() with a 30-minute reset scope',
249
+ '⏺ Bash(npm run check)',
250
+ ' ⎿ svelte-check found 0 errors and 0 warnings',
251
+ '',
252
+ 'Both endpoints compile cleanly. One open question before I wire the email send:',
253
+ 'should reset links expire in 30 minutes, or match the 15-minute access-token window?',
254
+ '⏺ Bash(jat-signal needs_input \'{"taskId":"jat-7h2k","question":"Reset link expiry: 30 min or match the 15-min access token?"}\')',
255
+ ' ⎿ Signal: needs_input (task: jat-7h2k)',
256
+ '',
257
+ '› 30 minutes is fine — people read email slowly.',
258
+ '',
259
+ 'Got it — keeping the 30-minute reset scope. Now wiring the email send through',
260
+ 'the existing Resend helper and adding a rate-limit guard so the endpoint can\'t be',
261
+ 'used to spam a victim\'s inbox.',
262
+ '⏺ Bash(jat-signal working \'{"taskId":"jat-7h2k","approach":"Wire Resend email + add per-email rate limit on reset-request"}\')',
263
+ ' ⎿ Signal: working (task: jat-7h2k)',
264
+ '⏺ Edit(src/routes/api/auth/reset-request/+server.ts)',
265
+ ' ⎿ Sends reset email via sendEmail(); added 3-per-hour rate limit',
266
+ '⏺ Bash(npm run test -- auth)',
267
+ ' ⎿ 12 passing (auth reset flow covered)',
268
+ '',
269
+ 'All tests pass. The flow is complete: request → email → confirm → new password.',
270
+ 'Summarizing for review.',
271
+ '⏺ Bash(jat-signal review \'{"taskId":"jat-7h2k","summary":["Added reset-request + reset-confirm endpoints","30-min reset-scoped token","Resend email + 3/hr rate limit","12 tests passing"]}\')',
272
+ ' ⎿ Signal: review (task: jat-7h2k)',
273
+ '',
274
+ '🔍 READY FOR REVIEW: jat-7h2k — password reset flow implemented, tested, rate-limited.',
275
+ '',
276
+ '› /jat:complete',
277
+ '⏺ Bash(jat-step committing --task jat-7h2k)',
278
+ ' ⎿ Committed: feat(jat-7h2k): add password reset flow',
279
+ '⏺ Bash(jat-signal complete \'{"taskId":"jat-7h2k","summary":"Shipped password reset flow"}\')',
280
+ ' ⎿ Signal: complete (task: jat-7h2k)',
281
+ ''
282
+ ];
283
+ export function sampleLinkedSession() {
284
+ return buildLinkedSession(SAMPLE_TRANSCRIPT_LINES);
285
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Full Unicode emoji dataset organized by category.
3
+ * Each emoji has a character and searchable name.
4
+ * Based on Unicode CLDR emoji ordering, minus most flags.
5
+ */
6
+ export interface EmojiEntry {
7
+ char: string;
8
+ name: string;
9
+ }
10
+ export interface EmojiGroup {
11
+ label: string;
12
+ emojis: EmojiEntry[];
13
+ }
14
+ export declare const EMOJI_DATA: EmojiGroup[];
15
+ /** Flat array of all emojis for search */
16
+ export declare const ALL_EMOJIS: EmojiEntry[];
17
+ /** Search emojis by name, returns matching entries */
18
+ export declare function searchEmojis(query: string): EmojiEntry[];