@agentdeck/shared 0.2.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/adapter.d.ts +3 -1
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js +24 -0
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/command-builders.d.ts +7 -2
  6. package/dist/command-builders.d.ts.map +1 -1
  7. package/dist/command-builders.js +17 -2
  8. package/dist/command-builders.js.map +1 -1
  9. package/dist/connection-status.d.ts +42 -0
  10. package/dist/connection-status.d.ts.map +1 -0
  11. package/dist/connection-status.js +52 -0
  12. package/dist/connection-status.js.map +1 -0
  13. package/dist/d200h-layout.d.ts +131 -0
  14. package/dist/d200h-layout.d.ts.map +1 -0
  15. package/dist/d200h-layout.js +627 -0
  16. package/dist/d200h-layout.js.map +1 -0
  17. package/dist/design-tokens.d.ts +259 -0
  18. package/dist/design-tokens.d.ts.map +1 -0
  19. package/dist/design-tokens.js +156 -0
  20. package/dist/design-tokens.js.map +1 -0
  21. package/dist/eval-schema.d.ts +26 -2
  22. package/dist/eval-schema.d.ts.map +1 -1
  23. package/dist/eval-schema.js.map +1 -1
  24. package/dist/format-utils.d.ts +25 -0
  25. package/dist/format-utils.d.ts.map +1 -1
  26. package/dist/format-utils.js +45 -0
  27. package/dist/format-utils.js.map +1 -1
  28. package/dist/gateway-protocol.d.ts +1 -1
  29. package/dist/gateway-protocol.js +1 -1
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +8 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm-settings.d.ts +3 -3
  35. package/dist/llm-settings.d.ts.map +1 -1
  36. package/dist/llm-settings.js +3 -3
  37. package/dist/llm-settings.js.map +1 -1
  38. package/dist/net-utils.d.ts +2 -1
  39. package/dist/net-utils.d.ts.map +1 -1
  40. package/dist/net-utils.js +100 -3
  41. package/dist/net-utils.js.map +1 -1
  42. package/dist/pricing.d.ts +45 -0
  43. package/dist/pricing.d.ts.map +1 -0
  44. package/dist/pricing.js +93 -0
  45. package/dist/pricing.js.map +1 -0
  46. package/dist/protocol.d.ts +175 -5
  47. package/dist/protocol.d.ts.map +1 -1
  48. package/dist/protocol.js +11 -1
  49. package/dist/protocol.js.map +1 -1
  50. package/dist/sample.d.ts +152 -0
  51. package/dist/sample.d.ts.map +1 -0
  52. package/dist/sample.js +22 -0
  53. package/dist/sample.js.map +1 -0
  54. package/dist/session-utils.d.ts +82 -2
  55. package/dist/session-utils.d.ts.map +1 -1
  56. package/dist/session-utils.js +205 -10
  57. package/dist/session-utils.js.map +1 -1
  58. package/dist/state-colors.d.ts.map +1 -1
  59. package/dist/state-colors.js +2 -0
  60. package/dist/state-colors.js.map +1 -1
  61. package/dist/states.d.ts +1 -0
  62. package/dist/states.d.ts.map +1 -1
  63. package/dist/states.js +6 -1
  64. package/dist/states.js.map +1 -1
  65. package/dist/svg-renderers/agent-logos.d.ts +17 -5
  66. package/dist/svg-renderers/agent-logos.d.ts.map +1 -1
  67. package/dist/svg-renderers/agent-logos.js +177 -39
  68. package/dist/svg-renderers/agent-logos.js.map +1 -1
  69. package/dist/svg-renderers/session-slot-renderer.d.ts +59 -6
  70. package/dist/svg-renderers/session-slot-renderer.d.ts.map +1 -1
  71. package/dist/svg-renderers/session-slot-renderer.js +398 -209
  72. package/dist/svg-renderers/session-slot-renderer.js.map +1 -1
  73. package/dist/svg-renderers/text-utils.d.ts +14 -0
  74. package/dist/svg-renderers/text-utils.d.ts.map +1 -1
  75. package/dist/svg-renderers/text-utils.js +34 -0
  76. package/dist/svg-renderers/text-utils.js.map +1 -1
  77. package/dist/telemetry-envelope.d.ts +1 -1
  78. package/dist/telemetry-envelope.d.ts.map +1 -1
  79. package/dist/timeline-icons.d.ts +70 -0
  80. package/dist/timeline-icons.d.ts.map +1 -0
  81. package/dist/timeline-icons.js +161 -0
  82. package/dist/timeline-icons.js.map +1 -0
  83. package/dist/timeline-label.d.ts +38 -0
  84. package/dist/timeline-label.d.ts.map +1 -0
  85. package/dist/timeline-label.js +95 -0
  86. package/dist/timeline-label.js.map +1 -0
  87. package/dist/timeline-markdown.d.ts +80 -0
  88. package/dist/timeline-markdown.d.ts.map +1 -0
  89. package/dist/timeline-markdown.js +221 -0
  90. package/dist/timeline-markdown.js.map +1 -0
  91. package/dist/timeline-summarizer.d.ts +24 -0
  92. package/dist/timeline-summarizer.d.ts.map +1 -1
  93. package/dist/timeline-summarizer.js +55 -13
  94. package/dist/timeline-summarizer.js.map +1 -1
  95. package/dist/timeline.d.ts +72 -2
  96. package/dist/timeline.d.ts.map +1 -1
  97. package/dist/timeline.js +187 -10
  98. package/dist/timeline.js.map +1 -1
  99. package/package.json +1 -1
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Lightweight markdown parser for timeline detail panes.
3
+ *
4
+ * Output is a flat array of typed lines that each platform renders natively
5
+ * (SwiftUI / Compose). Pure data — no rendering. Mirrors the Apple parser at
6
+ * apple/AgentDeck/UI/Monitor/TimelineStripView.swift `TimelineMarkdownLine`
7
+ * and the Android port at
8
+ * android/.../ui/timeline/TimelineMarkdown.kt — keep the three in lockstep.
9
+ *
10
+ * Block grammar (line-oriented):
11
+ * - ``` toggles a code fence; lines inside become `code` (verbatim, no inline parsing)
12
+ * - empty / whitespace-only line → `blank`
13
+ * - 1-6 leading hashes + space → `heading` (level 1-6; CommonMark ATX)
14
+ * - `- ` or `* ` → `bullet`
15
+ * - `<digits>.` or `<digits>)` followed by space → `numbered`
16
+ * - `> ` → `quote`
17
+ * - `|...|` (with optional `|---|` separator) → `table` block
18
+ * - anything else → `text`
19
+ *
20
+ * Inline grammar (per `parseInlineSpans`, applied at render time to non-code
21
+ * line content + table cells; first-match-wins, no recursion):
22
+ * - `` `code` `` → `code` span
23
+ * - `**bold**` → `bold` span
24
+ * - `*italic*` → `italic` span (only when not adjacent to another `*`)
25
+ * - `[text](href)` → `link` span
26
+ * - everything else → `plain` span
27
+ */
28
+ export type MarkdownLine = {
29
+ kind: 'blank';
30
+ } | {
31
+ kind: 'heading';
32
+ level: 1 | 2 | 3 | 4 | 5 | 6;
33
+ content: string;
34
+ } | {
35
+ kind: 'bullet';
36
+ content: string;
37
+ } | {
38
+ kind: 'numbered';
39
+ marker: string;
40
+ content: string;
41
+ } | {
42
+ kind: 'quote';
43
+ content: string;
44
+ } | {
45
+ kind: 'code';
46
+ content: string;
47
+ } | {
48
+ kind: 'text';
49
+ content: string;
50
+ } | {
51
+ kind: 'table';
52
+ rows: string[][];
53
+ hasHeader: boolean;
54
+ };
55
+ export type InlineSpan = {
56
+ kind: 'plain';
57
+ text: string;
58
+ } | {
59
+ kind: 'bold';
60
+ text: string;
61
+ } | {
62
+ kind: 'italic';
63
+ text: string;
64
+ } | {
65
+ kind: 'code';
66
+ text: string;
67
+ } | {
68
+ kind: 'link';
69
+ text: string;
70
+ href: string;
71
+ };
72
+ export declare function parseTimelineMarkdown(text: string): MarkdownLine[];
73
+ /**
74
+ * Tokenize a single line of inline content into spans. First-match-wins
75
+ * left-to-right walker; never recurses (so e.g. `**bold *with italic***` is
76
+ * just bold + plain — keeps the implementation simple and the platform ports
77
+ * trivial). Always returns at least one span; empty input → empty array.
78
+ */
79
+ export declare function parseInlineSpans(text: string): InlineSpan[];
80
+ //# sourceMappingURL=timeline-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-markdown.d.ts","sourceRoot":"","sources":["../src/timeline-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAgFlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CA8E3D"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Lightweight markdown parser for timeline detail panes.
3
+ *
4
+ * Output is a flat array of typed lines that each platform renders natively
5
+ * (SwiftUI / Compose). Pure data — no rendering. Mirrors the Apple parser at
6
+ * apple/AgentDeck/UI/Monitor/TimelineStripView.swift `TimelineMarkdownLine`
7
+ * and the Android port at
8
+ * android/.../ui/timeline/TimelineMarkdown.kt — keep the three in lockstep.
9
+ *
10
+ * Block grammar (line-oriented):
11
+ * - ``` toggles a code fence; lines inside become `code` (verbatim, no inline parsing)
12
+ * - empty / whitespace-only line → `blank`
13
+ * - 1-6 leading hashes + space → `heading` (level 1-6; CommonMark ATX)
14
+ * - `- ` or `* ` → `bullet`
15
+ * - `<digits>.` or `<digits>)` followed by space → `numbered`
16
+ * - `> ` → `quote`
17
+ * - `|...|` (with optional `|---|` separator) → `table` block
18
+ * - anything else → `text`
19
+ *
20
+ * Inline grammar (per `parseInlineSpans`, applied at render time to non-code
21
+ * line content + table cells; first-match-wins, no recursion):
22
+ * - `` `code` `` → `code` span
23
+ * - `**bold**` → `bold` span
24
+ * - `*italic*` → `italic` span (only when not adjacent to another `*`)
25
+ * - `[text](href)` → `link` span
26
+ * - everything else → `plain` span
27
+ */
28
+ export function parseTimelineMarkdown(text) {
29
+ if (!text)
30
+ return [];
31
+ const out = [];
32
+ let inCodeFence = false;
33
+ const lines = text.split(/\r?\n/);
34
+ let i = 0;
35
+ while (i < lines.length) {
36
+ const rawLine = lines[i];
37
+ const trimmed = rawLine.trim();
38
+ if (trimmed.startsWith('```')) {
39
+ inCodeFence = !inCodeFence;
40
+ i += 1;
41
+ continue;
42
+ }
43
+ if (inCodeFence) {
44
+ out.push({ kind: 'code', content: rawLine });
45
+ i += 1;
46
+ continue;
47
+ }
48
+ if (trimmed.length === 0) {
49
+ out.push({ kind: 'blank' });
50
+ i += 1;
51
+ continue;
52
+ }
53
+ // Table block: current line looks like `|...|`. Optional separator on
54
+ // next line marks the previous row as header. Continue collecting rows
55
+ // while subsequent lines are also table-rows.
56
+ if (isTableRow(trimmed)) {
57
+ const rows = [splitCells(trimmed)];
58
+ let hasHeader = false;
59
+ let j = i + 1;
60
+ if (j < lines.length && isTableSeparator(lines[j].trim())) {
61
+ hasHeader = true;
62
+ j += 1;
63
+ }
64
+ while (j < lines.length) {
65
+ const nextTrimmed = lines[j].trim();
66
+ if (!isTableRow(nextTrimmed) || isTableSeparator(nextTrimmed))
67
+ break;
68
+ rows.push(splitCells(nextTrimmed));
69
+ j += 1;
70
+ }
71
+ out.push({ kind: 'table', rows, hasHeader });
72
+ i = j;
73
+ continue;
74
+ }
75
+ const heading = parseHeading(trimmed);
76
+ if (heading) {
77
+ out.push({ kind: 'heading', level: heading.level, content: heading.content });
78
+ i += 1;
79
+ continue;
80
+ }
81
+ if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {
82
+ out.push({ kind: 'bullet', content: trimmed.slice(2) });
83
+ i += 1;
84
+ continue;
85
+ }
86
+ const numbered = parseNumbered(trimmed);
87
+ if (numbered) {
88
+ out.push({ kind: 'numbered', marker: numbered.marker, content: numbered.content });
89
+ i += 1;
90
+ continue;
91
+ }
92
+ if (trimmed.startsWith('> ')) {
93
+ out.push({ kind: 'quote', content: trimmed.slice(2) });
94
+ i += 1;
95
+ continue;
96
+ }
97
+ out.push({ kind: 'text', content: rawLine });
98
+ i += 1;
99
+ }
100
+ return out.length === 0 ? [{ kind: 'text', content: text }] : out;
101
+ }
102
+ /**
103
+ * Tokenize a single line of inline content into spans. First-match-wins
104
+ * left-to-right walker; never recurses (so e.g. `**bold *with italic***` is
105
+ * just bold + plain — keeps the implementation simple and the platform ports
106
+ * trivial). Always returns at least one span; empty input → empty array.
107
+ */
108
+ export function parseInlineSpans(text) {
109
+ if (!text)
110
+ return [];
111
+ const out = [];
112
+ let pending = ''; // buffered plain text waiting to flush
113
+ const flushPlain = () => {
114
+ if (pending.length > 0) {
115
+ out.push({ kind: 'plain', text: pending });
116
+ pending = '';
117
+ }
118
+ };
119
+ let i = 0;
120
+ while (i < text.length) {
121
+ const ch = text[i];
122
+ // `code`
123
+ if (ch === '`') {
124
+ const close = text.indexOf('`', i + 1);
125
+ if (close > i) {
126
+ flushPlain();
127
+ out.push({ kind: 'code', text: text.slice(i + 1, close) });
128
+ i = close + 1;
129
+ continue;
130
+ }
131
+ }
132
+ // **bold**
133
+ if (ch === '*' && text[i + 1] === '*') {
134
+ const close = text.indexOf('**', i + 2);
135
+ if (close > i + 1) {
136
+ flushPlain();
137
+ out.push({ kind: 'bold', text: text.slice(i + 2, close) });
138
+ i = close + 2;
139
+ continue;
140
+ }
141
+ }
142
+ // *italic* — single `*`, not surrounded by another `*`
143
+ if (ch === '*' &&
144
+ text[i + 1] !== '*' &&
145
+ (i === 0 || text[i - 1] !== '*')) {
146
+ // Find a closing single `*` that isn't doubled.
147
+ let j = i + 1;
148
+ while (j < text.length) {
149
+ if (text[j] === '*' && text[j + 1] !== '*' && text[j - 1] !== '*')
150
+ break;
151
+ j += 1;
152
+ }
153
+ if (j < text.length && j > i + 1) {
154
+ flushPlain();
155
+ out.push({ kind: 'italic', text: text.slice(i + 1, j) });
156
+ i = j + 1;
157
+ continue;
158
+ }
159
+ }
160
+ // [text](href)
161
+ if (ch === '[') {
162
+ const closeBracket = text.indexOf(']', i + 1);
163
+ if (closeBracket > i && text[closeBracket + 1] === '(') {
164
+ const closeParen = text.indexOf(')', closeBracket + 2);
165
+ if (closeParen > closeBracket + 1) {
166
+ const linkText = text.slice(i + 1, closeBracket);
167
+ const href = text.slice(closeBracket + 2, closeParen);
168
+ flushPlain();
169
+ out.push({ kind: 'link', text: linkText, href });
170
+ i = closeParen + 1;
171
+ continue;
172
+ }
173
+ }
174
+ }
175
+ pending += ch;
176
+ i += 1;
177
+ }
178
+ flushPlain();
179
+ return out.length === 0 ? [{ kind: 'plain', text }] : out;
180
+ }
181
+ function parseHeading(trimmed) {
182
+ let level = 0;
183
+ for (const ch of trimmed) {
184
+ if (ch === '#')
185
+ level += 1;
186
+ else
187
+ break;
188
+ }
189
+ if (level < 1 || level > 6)
190
+ return null;
191
+ if (trimmed.charAt(level) !== ' ')
192
+ return null;
193
+ return { level: level, content: trimmed.slice(level + 1) };
194
+ }
195
+ function parseNumbered(trimmed) {
196
+ const m = trimmed.match(/^(\d+)([.)])\s+(.*)$/);
197
+ if (!m)
198
+ return null;
199
+ return { marker: `${m[1]}${m[2]}`, content: m[3] };
200
+ }
201
+ // ---- Table helpers ----
202
+ const TABLE_ROW_RE = /^\s*\|.+\|\s*$/;
203
+ const TABLE_SEPARATOR_RE = /^\s*\|[-:\s|]+\|\s*$/;
204
+ function isTableRow(trimmed) {
205
+ return TABLE_ROW_RE.test(trimmed) && !isTableSeparator(trimmed);
206
+ }
207
+ function isTableSeparator(trimmed) {
208
+ if (!TABLE_SEPARATOR_RE.test(trimmed))
209
+ return false;
210
+ // Must contain at least one dash to be a real separator (not just `| | |`).
211
+ return /-/.test(trimmed);
212
+ }
213
+ function splitCells(rowLine) {
214
+ return rowLine
215
+ .trim()
216
+ .replace(/^\|/, '')
217
+ .replace(/\|$/, '')
218
+ .split('|')
219
+ .map((c) => c.trim());
220
+ }
221
+ //# sourceMappingURL=timeline-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-markdown.js","sourceRoot":"","sources":["../src/timeline-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAmBH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5B,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,8CAA8C;QAC9C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,GAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1D,SAAS,GAAG,IAAI,CAAC;gBACjB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,gBAAgB,CAAC,WAAW,CAAC;oBAAE,MAAM;gBACrE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBACnC,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7C,CAAC,GAAG,CAAC,CAAC;YACN,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACnF,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,uCAAuC;IACzD,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,SAAS;QACT,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,UAAU,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC3D,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,UAAU,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC3D,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IACE,EAAE,KAAK,GAAG;YACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;YACnB,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAChC,CAAC;YACD,gDAAgD;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;oBAAE,MAAM;gBACzE,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,UAAU,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACV,SAAS;YACX,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;gBACvD,IAAI,UAAU,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;oBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;oBACtD,UAAU,EAAE,CAAC;oBACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjD,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;oBACnB,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;QACd,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,UAAU,EAAE,CAAC;IACb,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;;YACtB,MAAM;IACb,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,0BAA0B;AAE1B,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAElD,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,4EAA4E;IAC5E,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,OAAO;SACX,IAAI,EAAE;SACN,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1B,CAAC"}
@@ -6,8 +6,32 @@ export declare const SUMMARY_SYSTEM_PROMPT = "You are a timeline summarizer. Giv
6
6
  /**
7
7
  * Extract a topic hint from the first few tokens of a response.
8
8
  * Used for immediate chat_start enrichment before LLM summarization.
9
+ *
10
+ * Korean handling: politeness-only responses ("네, 확인했습니다.") used to be
11
+ * stripped to empty and return null, leaving the timeline showing bare
12
+ * "Completed". Now the strip falls back to the pre-strip candidate so the
13
+ * row shows something meaningful.
9
14
  */
10
15
  export declare function extractTopicHint(text: string): string | null;
16
+ export type TopicHintKind = 'topic' | 'fallback' | null;
17
+ /**
18
+ * Same as `extractTopicHint` but tells the caller whether the result was a
19
+ * substantive topic (kind='topic') or just a politeness-fallback /
20
+ * first-sentence fallback (kind='fallback'). Lets emitters set
21
+ * `summaryKind: 'heuristic'` only when there's real content, vs `'none'`
22
+ * when we're scraping the bottom of the barrel.
23
+ */
24
+ export declare function extractTopicHintWithKind(text: string): {
25
+ hint: string | null;
26
+ kind: TopicHintKind;
27
+ };
28
+ /**
29
+ * Last-resort fallback when the response yielded no usable hint and the
30
+ * caller has the prompt text — produce a snippet of the prompt instead of
31
+ * literal "Completed". Returns the first sentence (up to `maxLen` chars,
32
+ * ending at `.` `!` `?` or newline) or null when prompt is too short.
33
+ */
34
+ export declare function promptSnippetFallback(prompt: string | null | undefined, maxLen?: number): string | null;
11
35
  /** Clean LLM output — strip thinking, quotes, markdown artifacts */
12
36
  export declare function cleanLLMOutput(content: string): string | null;
13
37
  //# sourceMappingURL=timeline-summarizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-summarizer.d.ts","sourceRoot":"","sources":["../src/timeline-summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,qBAAqB,wqBAIT,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2C5D;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4B7D"}
1
+ {"version":3,"file":"timeline-summarizer.d.ts","sourceRoot":"","sources":["../src/timeline-summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,qBAAqB,wqBAIT,CAAC;AAE1B;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAiD9C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,SAAK,GAAG,MAAM,GAAG,IAAI,CAWnG;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4B7D"}
@@ -11,26 +11,38 @@ export const SUMMARY_SYSTEM_PROMPT = `You are a timeline summarizer. Given an AI
11
11
  /**
12
12
  * Extract a topic hint from the first few tokens of a response.
13
13
  * Used for immediate chat_start enrichment before LLM summarization.
14
+ *
15
+ * Korean handling: politeness-only responses ("네, 확인했습니다.") used to be
16
+ * stripped to empty and return null, leaving the timeline showing bare
17
+ * "Completed". Now the strip falls back to the pre-strip candidate so the
18
+ * row shows something meaningful.
14
19
  */
15
20
  export function extractTopicHint(text) {
21
+ return extractTopicHintWithKind(text).hint;
22
+ }
23
+ /**
24
+ * Same as `extractTopicHint` but tells the caller whether the result was a
25
+ * substantive topic (kind='topic') or just a politeness-fallback /
26
+ * first-sentence fallback (kind='fallback'). Lets emitters set
27
+ * `summaryKind: 'heuristic'` only when there's real content, vs `'none'`
28
+ * when we're scraping the bottom of the barrel.
29
+ */
30
+ export function extractTopicHintWithKind(text) {
16
31
  if (!text || text.length < 5)
17
- return null;
18
- const lines = text.split('\n').map(l => l.trim()).filter(Boolean);
32
+ return { hint: null, kind: null };
33
+ const lines = text.split('\n').map((l) => l.trim()).filter(Boolean);
19
34
  // Find first non-markdown, non-code-fence, non-empty line
20
35
  let candidate = null;
21
36
  let inCodeFence = false;
22
37
  for (const line of lines) {
23
- // Track code fence boundaries
24
38
  if (/^```/.test(line)) {
25
39
  inCodeFence = !inCodeFence;
26
40
  continue;
27
41
  }
28
42
  if (inCodeFence)
29
43
  continue;
30
- // Skip headings-only
31
44
  if (/^#{1,6}\s*$/.test(line))
32
45
  continue;
33
- // Strip markdown decorators for evaluation
34
46
  const stripped = cleanRawText(line)
35
47
  .replace(/^[-*]\s+/, '')
36
48
  .replace(/^>\s+/, '')
@@ -41,15 +53,45 @@ export function extractTopicHint(text) {
41
53
  }
42
54
  }
43
55
  if (!candidate)
44
- return null;
56
+ return { hint: null, kind: null };
45
57
  const snippet = candidate.length > 80 ? candidate.slice(0, 77) + '...' : candidate;
46
- // Remove common Korean prefixes (chained — "네, 확인했습니다." "")
47
- let cleaned = snippet;
48
- // Strip leading "네," / "네." first, then polite phrases
49
- cleaned = cleaned.replace(/^네[,.]?\s*/i, '');
50
- cleaned = cleaned.replace(/^(완료했습니다\.\s*|알겠습니다\.\s*|확인했습니다\.\s*)/i, '');
51
- cleaned = cleaned.trim();
52
- return cleaned || null;
58
+ // Try stripping leading Korean polite closers — "네, " / "확인했습니다."
59
+ let cleaned = snippet
60
+ .replace(/^네[,.]?\s*/i, '')
61
+ .replace(/^(완료했습니다\.\s*|알겠습니다\.\s*|확인했습니다\.\s*)/i, '')
62
+ .trim();
63
+ if (cleaned.length >= 3) {
64
+ return { hint: cleaned, kind: 'topic' };
65
+ }
66
+ // Strip left only the EXTRA content beside the polite closer. If polite
67
+ // closer was the entire candidate, fall back to the candidate itself —
68
+ // "네, 확인했습니다." beats showing just "Completed".
69
+ if (snippet.length >= 3) {
70
+ return { hint: snippet, kind: 'fallback' };
71
+ }
72
+ return { hint: null, kind: null };
73
+ }
74
+ /**
75
+ * Last-resort fallback when the response yielded no usable hint and the
76
+ * caller has the prompt text — produce a snippet of the prompt instead of
77
+ * literal "Completed". Returns the first sentence (up to `maxLen` chars,
78
+ * ending at `.` `!` `?` or newline) or null when prompt is too short.
79
+ */
80
+ export function promptSnippetFallback(prompt, maxLen = 60) {
81
+ if (!prompt)
82
+ return null;
83
+ const trimmed = prompt.trim();
84
+ if (trimmed.length < 3)
85
+ return null;
86
+ // Cut at the first sentence terminator, otherwise at a hard line break.
87
+ const stop = trimmed.search(/[.!?。、]|\n/);
88
+ let snippet = stop > 0 ? trimmed.slice(0, stop) : trimmed;
89
+ snippet = snippet.trim();
90
+ if (snippet.length === 0)
91
+ snippet = trimmed;
92
+ if (snippet.length > maxLen)
93
+ snippet = snippet.slice(0, maxLen - 1).trim() + '…';
94
+ return snippet;
53
95
  }
54
96
  /** Clean LLM output — strip thinking, quotes, markdown artifacts */
55
97
  export function cleanLLMOutput(content) {
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-summarizer.js","sourceRoot":"","sources":["../src/timeline-summarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeline-summarizer.js","sourceRoot":"","sources":["../src/timeline-summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;yBAIZ,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAID;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAY;IAEZ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEpE,0DAA0D;IAC1D,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,WAAW;YAAE,SAAS;QAC1B,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAEvC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;aAChC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;aACpB,IAAI,EAAE,CAAC;QAEV,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACzB,SAAS,GAAG,QAAQ,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAElD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnF,mEAAmE;IACnE,IAAI,OAAO,GAAG,OAAO;SAClB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,wCAAwC,EAAE,EAAE,CAAC;SACrD,IAAI,EAAE,CAAC;IAEV,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiC,EAAE,MAAM,GAAG,EAAE;IAClF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,wEAAwE;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;IACjF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,GAAG,OAAO;QACnB,uDAAuD;SACtD,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;QACzC,mDAAmD;SAClD,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,IAAI,EAAE,CAAC;IAEV,6DAA6D;IAC7D,oDAAoD;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,4EAA4E;QAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,kDAAkD;IAClD,OAAO,GAAG,OAAO;SACd,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC;SAC/E,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,yBAAyB;SACnD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,iCAAiC;IACjC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;IAChE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -2,7 +2,9 @@
2
2
  * Shared timeline types and log parser for OpenClaw mode.
3
3
  * Used by both bridge (BridgeLogStream) and plugin (LogStream).
4
4
  */
5
- export type TimelineEntryType = 'tool_request' | 'tool_resolved' | 'chat_start' | 'chat_end' | 'chat_response' | 'error' | 'scheduled' | 'user_action' | 'model_call' | 'model_response' | 'memory_recall' | 'tool_exec' | 'eval_result';
5
+ export type TimelineEntryType = 'tool_request' | 'tool_resolved' | 'chat_start' | 'chat_end' | 'chat_response' | 'error' | 'scheduled' | 'user_action' | 'model_call' | 'model_response' | 'memory_recall' | 'tool_exec' | 'eval_result' | 'task_start' | 'task_end' | 'task_milestone';
6
+ import type { TaskBoundarySignal } from './eval-schema.js';
7
+ export type { TaskBoundarySignal } from './eval-schema.js';
6
8
  export interface TimelineEntry {
7
9
  ts: number;
8
10
  type: TimelineEntryType;
@@ -11,12 +13,71 @@ export interface TimelineEntry {
11
13
  approvalId?: string;
12
14
  status?: 'pending' | 'approved' | 'denied';
13
15
  agentType?: string;
16
+ projectName?: string;
17
+ sessionId?: string;
18
+ runId?: string;
19
+ startedAt?: number;
20
+ endedAt?: number;
14
21
  repeatCount?: number;
15
22
  automated?: boolean;
23
+ /** APME task id. Set on task_start/task_end and on every turn entry inside the task scope. */
24
+ taskId?: string;
25
+ /** Only on task_end. Why the task closed. */
26
+ boundarySignal?: TaskBoundarySignal;
27
+ /**
28
+ * Per-task evaluation result, attached when the task_judge resolves
29
+ * (always AFTER the initial task_end emit — clients upsert the existing
30
+ * row by (type='task_end', taskId) and merge these four fields).
31
+ *
32
+ * - `taskScore` : 0..1 composite (matches `tasks.composite_score`)
33
+ * - `taskOutcome` : terminal outcome string from `bridge/src/apme/outcome.ts`
34
+ * (`'committed' | 'abandoned' | 'iterated' | 'ab_winner' | 'ab_loser'
35
+ * | 'interrupted' | 'exploratory' | 'pending'`). UIs collapse into
36
+ * three visual classes — success / fail / partial / pending — and pick
37
+ * the badge color via design-system status tokens.
38
+ * - `taskCategory`: task_rollup category ('general' | 'conversation' | …)
39
+ * - `taskSummary` : one-line judge summary
40
+ */
41
+ taskScore?: number;
42
+ taskOutcome?: string;
43
+ taskCategory?: string;
44
+ taskSummary?: string;
45
+ /**
46
+ * How the row's `raw` summary was produced. Lets clients decide whether
47
+ * the detail pane is worth showing — when `'none'`, detail is just the
48
+ * unfiltered response that the heuristic couldn't summarize, and showing
49
+ * it duplicates content rather than adding value.
50
+ * - `'llm'` : LLM-summarized (clean, short, distinct from detail)
51
+ * - `'heuristic'`: topic-hint extracted from response or prompt
52
+ * - `'none'` : last-resort fallback (literal "Completed", bare tool name, etc.)
53
+ * - `'progress'`: non-terminal assistant status update (work still running)
54
+ */
55
+ summaryKind?: 'llm' | 'heuristic' | 'none' | 'progress';
16
56
  }
57
+ /**
58
+ * Prepare a chat-response body for storage as `entry.detail` while keeping
59
+ * markdown intact. Use this on chat_response / chat_end emit paths so the
60
+ * client renderer can apply heading / bullet / table / inline span styles —
61
+ * `cleanDetailText` would have stripped all of that before it ever reached
62
+ * the dashboard.
63
+ *
64
+ * Filters and caps:
65
+ * - System JSON blobs (`{"connectionId": ...}` etc.) → empty
66
+ * - Error JSON (`{"error": ...}`) → the error string
67
+ * - Other JSON object → compact stringified form (200 char cap)
68
+ * - Otherwise → original text with 3+ blank lines collapsed to 2, trimmed
69
+ *
70
+ * Markdown markers (`**`, `##`, `|`, `` ` ``, `[text](url)`, etc.) are
71
+ * preserved verbatim so the client `parseTimelineMarkdown` /
72
+ * `parseInlineSpans` can do their job.
73
+ */
74
+ export declare function prepareMarkdownDetail(text: string): string;
17
75
  /**
18
76
  * Clean detail text — strip markdown artifacts, JSON blobs, and system noise.
19
- * Applied to timeline entry `detail` fields before storage.
77
+ * Applied to timeline entry `detail` fields before storage on **non-chat**
78
+ * paths (tool errors, system log lines). Chat response detail should go
79
+ * through `prepareMarkdownDetail` instead so the dashboard can render the
80
+ * markdown.
20
81
  */
21
82
  export declare function cleanDetailText(text: string): string;
22
83
  /**
@@ -29,6 +90,15 @@ export declare function cleanRawText(text: string): string;
29
90
  * Applied to both raw and detail fields.
30
91
  */
31
92
  export declare function cleanNopMarkers(text: string): string;
93
+ export declare function isAssistantProgressUpdate(text?: string): boolean;
94
+ export declare function detailHasRealSignal(detail?: string): boolean;
95
+ export declare function isOpenClawPlaceholderRaw(raw: string): boolean;
96
+ export declare function isTaskNotificationChatStart(entry: TimelineEntry): boolean;
97
+ export declare function isOpenClawLowSignalResponse(entry: TimelineEntry): boolean;
98
+ export declare function isOpenClawCronPrompt(text?: string): boolean;
99
+ export declare function summarizeOpenClawCronPrompt(text?: string): string;
100
+ export declare function shouldDropLowSignalTimelineEntry(entry: TimelineEntry): boolean;
101
+ export declare function normalizeTimelineEntryForStorage(entry: TimelineEntry): TimelineEntry | null;
32
102
  /**
33
103
  * Extract the semantic core of a timeline entry for dedup comparison.
34
104
  * For chat_end: strip duration/tool suffix (everything after first ' · ').
@@ -1 +1 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,iBAAiB,GACzB,cAAc,GAAG,eAAe,GAAG,YAAY,GAAG,UAAU,GAC5D,eAAe,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GACvD,YAAY,GAAG,gBAAgB,GAAG,eAAe,GAAG,WAAW,GAC/D,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAuDD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8CpD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAMhF;AA2DD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,SAAS,aAAa,EAAE,EACvC,QAAQ,SAAY,GACnB,MAAM,CA4BR;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5C,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,iBAAiB,CAgCnB;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA2MhE"}
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}