@agentuity/coder 1.0.37

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 (92) hide show
  1. package/README.md +57 -0
  2. package/dist/chain-preview.d.ts +55 -0
  3. package/dist/chain-preview.d.ts.map +1 -0
  4. package/dist/chain-preview.js +472 -0
  5. package/dist/chain-preview.js.map +1 -0
  6. package/dist/client.d.ts +43 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +402 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands.d.ts +22 -0
  11. package/dist/commands.d.ts.map +1 -0
  12. package/dist/commands.js +99 -0
  13. package/dist/commands.js.map +1 -0
  14. package/dist/footer.d.ts +34 -0
  15. package/dist/footer.d.ts.map +1 -0
  16. package/dist/footer.js +249 -0
  17. package/dist/footer.js.map +1 -0
  18. package/dist/handlers.d.ts +24 -0
  19. package/dist/handlers.d.ts.map +1 -0
  20. package/dist/handlers.js +83 -0
  21. package/dist/handlers.js.map +1 -0
  22. package/dist/hub-overlay.d.ts +107 -0
  23. package/dist/hub-overlay.d.ts.map +1 -0
  24. package/dist/hub-overlay.js +1794 -0
  25. package/dist/hub-overlay.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +1585 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/output-viewer.d.ts +49 -0
  31. package/dist/output-viewer.d.ts.map +1 -0
  32. package/dist/output-viewer.js +389 -0
  33. package/dist/output-viewer.js.map +1 -0
  34. package/dist/overlay.d.ts +40 -0
  35. package/dist/overlay.d.ts.map +1 -0
  36. package/dist/overlay.js +225 -0
  37. package/dist/overlay.js.map +1 -0
  38. package/dist/protocol.d.ts +118 -0
  39. package/dist/protocol.d.ts.map +1 -0
  40. package/dist/protocol.js +3 -0
  41. package/dist/protocol.js.map +1 -0
  42. package/dist/remote-session.d.ts +113 -0
  43. package/dist/remote-session.d.ts.map +1 -0
  44. package/dist/remote-session.js +645 -0
  45. package/dist/remote-session.js.map +1 -0
  46. package/dist/remote-tui.d.ts +40 -0
  47. package/dist/remote-tui.d.ts.map +1 -0
  48. package/dist/remote-tui.js +606 -0
  49. package/dist/remote-tui.js.map +1 -0
  50. package/dist/renderers.d.ts +34 -0
  51. package/dist/renderers.d.ts.map +1 -0
  52. package/dist/renderers.js +669 -0
  53. package/dist/renderers.js.map +1 -0
  54. package/dist/review.d.ts +15 -0
  55. package/dist/review.d.ts.map +1 -0
  56. package/dist/review.js +154 -0
  57. package/dist/review.js.map +1 -0
  58. package/dist/titlebar.d.ts +3 -0
  59. package/dist/titlebar.d.ts.map +1 -0
  60. package/dist/titlebar.js +59 -0
  61. package/dist/titlebar.js.map +1 -0
  62. package/dist/todo/index.d.ts +3 -0
  63. package/dist/todo/index.d.ts.map +1 -0
  64. package/dist/todo/index.js +3 -0
  65. package/dist/todo/index.js.map +1 -0
  66. package/dist/todo/store.d.ts +6 -0
  67. package/dist/todo/store.d.ts.map +1 -0
  68. package/dist/todo/store.js +43 -0
  69. package/dist/todo/store.js.map +1 -0
  70. package/dist/todo/types.d.ts +13 -0
  71. package/dist/todo/types.d.ts.map +1 -0
  72. package/dist/todo/types.js +2 -0
  73. package/dist/todo/types.js.map +1 -0
  74. package/package.json +44 -0
  75. package/src/chain-preview.ts +621 -0
  76. package/src/client.ts +515 -0
  77. package/src/commands.ts +132 -0
  78. package/src/footer.ts +305 -0
  79. package/src/handlers.ts +113 -0
  80. package/src/hub-overlay.ts +2324 -0
  81. package/src/index.ts +1907 -0
  82. package/src/output-viewer.ts +480 -0
  83. package/src/overlay.ts +294 -0
  84. package/src/protocol.ts +157 -0
  85. package/src/remote-session.ts +800 -0
  86. package/src/remote-tui.ts +707 -0
  87. package/src/renderers.ts +740 -0
  88. package/src/review.ts +201 -0
  89. package/src/titlebar.ts +63 -0
  90. package/src/todo/index.ts +2 -0
  91. package/src/todo/store.ts +49 -0
  92. package/src/todo/types.ts +14 -0
package/dist/footer.js ADDED
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Coder footer for the Pi TUI.
3
+ *
4
+ * Uses transparent backgrounds with foreground-only ANSI true-color text.
5
+ * Includes a braille spinner animation when an agent is actively working.
6
+ *
7
+ * Layout:
8
+ * [brand] [branch] > [model/agent] [hub] | [N] label token-stats
9
+ *
10
+ * Observer awareness (ASCII only):
11
+ * [3] SwiftRaven — 3 observers watching, session label "SwiftRaven"
12
+ */
13
+ const RESET = '\x1b[0m';
14
+ const SEP = '>';
15
+ function fg(color, text) {
16
+ return `\x1b[38;2;${color[0]};${color[1]};${color[2]}m${text}`;
17
+ }
18
+ // ──────────────────────────────────────────────
19
+ // Color palette (foreground only, no backgrounds)
20
+ // ──────────────────────────────────────────────
21
+ const FG_BRAND = [100, 200, 255];
22
+ const FG_MODEL = [215, 135, 175];
23
+ const FG_AGENT = [130, 200, 130];
24
+ const FG_BRANCH = [150, 180, 150];
25
+ const FG_HUB_OK = [80, 200, 120];
26
+ const FG_HUB_WARN = [245, 179, 66];
27
+ const FG_HUB_ERR = [220, 80, 80];
28
+ const FG_DIM = [100, 110, 120];
29
+ const FG_OBSERVER = [140, 180, 220];
30
+ // ──────────────────────────────────────────────
31
+ // Braille spinner
32
+ // ──────────────────────────────────────────────
33
+ const SPINNER_FRAMES = [
34
+ '\u280B',
35
+ '\u2819',
36
+ '\u2839',
37
+ '\u2838',
38
+ '\u283C',
39
+ '\u2834',
40
+ '\u2826',
41
+ '\u2827',
42
+ '\u2807',
43
+ '\u280F',
44
+ ];
45
+ // ──────────────────────────────────────────────
46
+ // Footer builder (transparent bg, foreground only)
47
+ // ──────────────────────────────────────────────
48
+ /** Strip ANSI escape sequences to get visible character count. */
49
+ function visibleLength(str) {
50
+ // eslint-disable-next-line no-control-regex
51
+ return str.replace(/\x1b\[[0-9;]*m/g, '').length;
52
+ }
53
+ /** Truncate an ANSI-colored string to a maximum visible width. */
54
+ function truncateAnsi(str, maxWidth) {
55
+ let visible = 0;
56
+ let i = 0;
57
+ while (i < str.length && visible < maxWidth) {
58
+ if (str[i] === '\x1b') {
59
+ // Skip entire ANSI escape sequence
60
+ const end = str.indexOf('m', i);
61
+ if (end !== -1) {
62
+ i = end + 1;
63
+ }
64
+ else {
65
+ i++;
66
+ }
67
+ }
68
+ else {
69
+ visible++;
70
+ i++;
71
+ }
72
+ }
73
+ return str.slice(0, i) + RESET;
74
+ }
75
+ function buildFooter(left, rightText, width) {
76
+ // Safety margin for Unicode characters that may be double-width
77
+ const safeWidth = width - 4;
78
+ const leftLen = visibleLength(left);
79
+ const rightLen = visibleLength(rightText);
80
+ const total = leftLen + 1 + rightLen;
81
+ if (total > safeWidth) {
82
+ const maxLeft = safeWidth - rightLen - 1;
83
+ if (maxLeft > 0) {
84
+ return truncateAnsi(left, maxLeft) + ' ' + rightText;
85
+ }
86
+ return truncateAnsi(left + ' ' + rightText, safeWidth);
87
+ }
88
+ const gap = safeWidth - leftLen - rightLen;
89
+ return left + ' '.repeat(gap) + rightText;
90
+ }
91
+ // ──────────────────────────────────────────────
92
+ // Minimal component
93
+ // ──────────────────────────────────────────────
94
+ class FooterComponent {
95
+ getText;
96
+ _unsubscribeBranch;
97
+ constructor(getText, footerData, cleanupSpinner) {
98
+ this.getText = getText;
99
+ this._cleanupSpinner = cleanupSpinner;
100
+ this._unsubscribeBranch = footerData.onBranchChange(() => {
101
+ // Triggers TUI refresh
102
+ });
103
+ }
104
+ _cleanupSpinner;
105
+ render(width) {
106
+ const text = this.getText(width);
107
+ // Final safety: ensure line never exceeds terminal width
108
+ if (visibleLength(text) > width) {
109
+ return [truncateAnsi(text, width)];
110
+ }
111
+ return [text];
112
+ }
113
+ invalidate() {
114
+ // no-op
115
+ }
116
+ dispose() {
117
+ this._unsubscribeBranch?.();
118
+ this._cleanupSpinner();
119
+ }
120
+ }
121
+ // ──────────────────────────────────────────────
122
+ // Token stat formatters
123
+ // ──────────────────────────────────────────────
124
+ function formatTokens(n) {
125
+ if (n >= 1_000_000)
126
+ return `${(n / 1_000_000).toFixed(1)}M`;
127
+ if (n >= 1_000)
128
+ return `${(n / 1_000).toFixed(1)}K`;
129
+ return String(n);
130
+ }
131
+ function formatCost(n) {
132
+ if (n === 0)
133
+ return '$0.00';
134
+ if (n < 0.01)
135
+ return `$${n.toFixed(4)}`;
136
+ return `$${n.toFixed(2)}`;
137
+ }
138
+ // ──────────────────────────────────────────────
139
+ // Public API
140
+ // ──────────────────────────────────────────────
141
+ /**
142
+ * Set up the Coder footer (transparent bg, foreground-colored text).
143
+ * Call this once with the extension context to replace Pi's default footer.
144
+ *
145
+ * Includes a braille spinner animation when an agent is actively working.
146
+ *
147
+ * @param ctx Extension context with UI access
148
+ * @param getHubStatus Callback that returns current Hub connection status
149
+ * @param getObserverState Optional callback that returns observer count + session label
150
+ */
151
+ export function setupCoderFooter(ctx, getHubStatus, getObserverState) {
152
+ if (!ctx.hasUI)
153
+ return;
154
+ ctx.ui.setFooter((tui, _theme, footerData) => {
155
+ // Spinner state
156
+ let spinnerTimer = null;
157
+ let spinnerFrame = 0;
158
+ const getText = (width) => {
159
+ // Detect active agent
160
+ const activeAgent = footerData.getExtensionStatuses().get('active_agent');
161
+ // Start/stop spinner based on agent activity
162
+ if (activeAgent && !spinnerTimer) {
163
+ spinnerTimer = setInterval(() => {
164
+ spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES.length;
165
+ tui.requestRender();
166
+ }, 80);
167
+ }
168
+ else if (!activeAgent && spinnerTimer) {
169
+ clearInterval(spinnerTimer);
170
+ spinnerTimer = null;
171
+ spinnerFrame = 0;
172
+ }
173
+ // Token stats from session messages
174
+ let inputTokens = 0;
175
+ let outputTokens = 0;
176
+ let totalCost = 0;
177
+ for (const entry of ctx.sessionManager.getBranch()) {
178
+ if (entry.type === 'message') {
179
+ const msg = entry.message;
180
+ if (msg.role === 'assistant' && msg.usage) {
181
+ inputTokens += msg.usage.input;
182
+ outputTokens += msg.usage.output;
183
+ totalCost += msg.usage.cost.total;
184
+ }
185
+ }
186
+ }
187
+ const tokenStr = `\u2191${formatTokens(inputTokens)} \u2193${formatTokens(outputTokens)} ${formatCost(totalCost)}`;
188
+ // LEFT side: brand > branch > model/agent
189
+ const leftParts = [];
190
+ // Brand (with spinner)
191
+ const brandChar = spinnerTimer ? SPINNER_FRAMES[spinnerFrame] : '\u2A3A';
192
+ leftParts.push(fg(FG_BRAND, ` ${brandChar}`));
193
+ // Branch
194
+ const branch = footerData.getGitBranch();
195
+ if (branch) {
196
+ leftParts.push(' ');
197
+ leftParts.push(fg(FG_BRANCH, branch));
198
+ }
199
+ // Model or active agent
200
+ leftParts.push(fg(FG_DIM, ` ${SEP} `));
201
+ if (activeAgent) {
202
+ leftParts.push(fg(FG_AGENT, activeAgent));
203
+ }
204
+ else {
205
+ const modelId = ctx.model ? String(ctx.model.id ?? '?') : '?';
206
+ leftParts.push(fg(FG_MODEL, modelId));
207
+ }
208
+ const left = leftParts.join('');
209
+ // RIGHT side: hub status + observer info + token stats
210
+ const rightParts = [];
211
+ const hubStatus = getHubStatus();
212
+ if (hubStatus === 'connected') {
213
+ rightParts.push(fg(FG_HUB_OK, 'Hub'));
214
+ }
215
+ else if (hubStatus === 'reconnecting') {
216
+ rightParts.push(fg(FG_HUB_WARN, 'Hub...'));
217
+ }
218
+ else {
219
+ rightParts.push(fg(FG_HUB_ERR, 'Hub Off'));
220
+ }
221
+ // Observer awareness (ASCII only, no emojis)
222
+ if (getObserverState && hubStatus === 'connected') {
223
+ const obs = getObserverState();
224
+ if (obs.count > 0 || obs.label) {
225
+ rightParts.push(fg(FG_DIM, ' | '));
226
+ if (obs.count > 0) {
227
+ rightParts.push(fg(FG_OBSERVER, `[${obs.count}]`));
228
+ if (obs.label)
229
+ rightParts.push(' ');
230
+ }
231
+ if (obs.label) {
232
+ rightParts.push(fg(FG_OBSERVER, obs.label));
233
+ }
234
+ }
235
+ }
236
+ rightParts.push(fg(FG_DIM, ` ${tokenStr}`) + RESET);
237
+ const rightText = rightParts.join('');
238
+ return buildFooter(left, rightText, width);
239
+ };
240
+ const cleanupSpinner = () => {
241
+ if (spinnerTimer) {
242
+ clearInterval(spinnerTimer);
243
+ spinnerTimer = null;
244
+ }
245
+ };
246
+ return new FooterComponent(getText, footerData, cleanupSpinner);
247
+ });
248
+ }
249
+ //# sourceMappingURL=footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../src/footer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { HubAction } from './protocol.ts';
2
+ export interface ActionResult {
3
+ block?: {
4
+ block: true;
5
+ reason: string;
6
+ };
7
+ returnValue?: unknown;
8
+ systemPrompt?: string;
9
+ systemPromptMode?: 'replace' | 'prefix' | 'suffix';
10
+ }
11
+ /** Minimal UI surface used by action handlers — avoids a hard dep on pi-coding-agent. */
12
+ interface ActionContext {
13
+ ui?: {
14
+ notify(message: string, level?: 'info' | 'warning' | 'error'): void;
15
+ confirm(title: string, message: string): Promise<boolean>;
16
+ setStatus(key: string, text?: string): void;
17
+ };
18
+ sendUserMessage?: (message: string, options?: {
19
+ deliverAs?: 'followUp';
20
+ }) => void;
21
+ }
22
+ export declare function processActions(actions: HubAction[], ctx: ActionContext): Promise<ActionResult>;
23
+ export {};
24
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAEnD;AAED,yFAAyF;AACzF,UAAU,aAAa;IACtB,EAAE,CAAC,EAAE;QACJ,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;QACpE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5C,CAAC;IACF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,CAAC;CAClF;AAED,wBAAsB,cAAc,CACnC,OAAO,EAAE,SAAS,EAAE,EACpB,GAAG,EAAE,aAAa,GAChB,OAAO,CAAC,YAAY,CAAC,CAyFvB"}
@@ -0,0 +1,83 @@
1
+ export async function processActions(actions, ctx) {
2
+ let result = {};
3
+ for (const action of actions) {
4
+ switch (action.action) {
5
+ case 'ACK':
6
+ // Terminal: proceed normally
7
+ result = {};
8
+ break;
9
+ case 'BLOCK':
10
+ // Terminal: block
11
+ result = { block: { block: true, reason: action.reason } };
12
+ break;
13
+ case 'RETURN':
14
+ // Terminal: return a specific result
15
+ result = { returnValue: action.result };
16
+ break;
17
+ case 'NOTIFY':
18
+ // Side effect: show notification, continue
19
+ if (ctx?.ui) {
20
+ ctx.ui.notify(action.message, action.level ?? 'info');
21
+ }
22
+ break;
23
+ case 'STATUS':
24
+ // Side effect: set status, continue
25
+ if (ctx?.ui) {
26
+ ctx.ui.setStatus(action.key, action.text);
27
+ }
28
+ break;
29
+ case 'CONFIRM': {
30
+ // Gate: if user denies, stop and block
31
+ if (ctx?.ui) {
32
+ const confirmed = await ctx.ui.confirm(action.title, action.message);
33
+ if (!confirmed) {
34
+ return {
35
+ block: {
36
+ block: true,
37
+ reason: action.deny_reason ?? 'Denied by user',
38
+ },
39
+ };
40
+ }
41
+ }
42
+ else {
43
+ // No UI available — block by default for safety
44
+ result = {
45
+ block: {
46
+ block: true,
47
+ reason: action.deny_reason ?? 'Confirmation required but no UI available',
48
+ },
49
+ };
50
+ }
51
+ break;
52
+ }
53
+ case 'SYSTEM_PROMPT':
54
+ // System prompt injection — store for before_agent_start handler
55
+ result = {
56
+ ...result,
57
+ systemPrompt: action.systemPrompt,
58
+ systemPromptMode: action.mode,
59
+ };
60
+ break;
61
+ case 'INJECT_MESSAGE': {
62
+ const content = action.message?.content?.trim();
63
+ if (!content)
64
+ break;
65
+ if (action.message?.role === 'user') {
66
+ if (ctx.sendUserMessage) {
67
+ ctx.sendUserMessage(content, { deliverAs: 'followUp' });
68
+ }
69
+ else if (ctx.ui) {
70
+ ctx.ui.notify(content, 'info');
71
+ }
72
+ break;
73
+ }
74
+ if (ctx.ui) {
75
+ ctx.ui.notify(content, 'info');
76
+ }
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { type Theme } from '@mariozechner/pi-coding-agent';
2
+ interface Component {
3
+ render(width: number): string[];
4
+ handleInput?(data: string): void;
5
+ invalidate(): void;
6
+ }
7
+ interface Focusable {
8
+ focused: boolean;
9
+ }
10
+ interface TUIRef {
11
+ requestRender(): void;
12
+ }
13
+ interface HubOverlayOptions {
14
+ baseUrl: string;
15
+ currentSessionId?: string;
16
+ initialSessionId?: string;
17
+ startInDetail?: boolean;
18
+ done: (result: undefined) => void;
19
+ }
20
+ export declare class HubOverlay implements Component, Focusable {
21
+ focused: boolean;
22
+ private readonly tui;
23
+ private readonly theme;
24
+ private readonly done;
25
+ private readonly baseUrl;
26
+ private readonly currentSessionId?;
27
+ private screen;
28
+ private selectedIndex;
29
+ private detailSessionId;
30
+ private detailScrollOffset;
31
+ private detailMaxScroll;
32
+ private feedScrollOffset;
33
+ private feedMaxScroll;
34
+ private feedScope;
35
+ private feedViewMode;
36
+ private showFeedThinking;
37
+ private feedFollowing;
38
+ private taskScrollOffset;
39
+ private taskMaxScroll;
40
+ private selectedTaskIndex;
41
+ private showTaskThinking;
42
+ private taskFollowing;
43
+ private sessions;
44
+ private detail;
45
+ private cachedTodos;
46
+ private feed;
47
+ private sessionFeed;
48
+ private sessionBuffers;
49
+ private taskBuffers;
50
+ private hydratedSessions;
51
+ private previousDigests;
52
+ private loadingList;
53
+ private loadingDetail;
54
+ private listError;
55
+ private detailError;
56
+ private lastUpdatedAt;
57
+ private listInFlight;
58
+ private detailInFlight;
59
+ private sseControllers;
60
+ private disposed;
61
+ private pollTimer;
62
+ private mdRenderer;
63
+ constructor(tui: TUIRef, theme: Theme, options: HubOverlayOptions);
64
+ handleInput(data: string): void;
65
+ render(width: number): string[];
66
+ invalidate(): void;
67
+ dispose(): void;
68
+ private requestRender;
69
+ private close;
70
+ private handleListInput;
71
+ private isSessionContext;
72
+ private handleDetailInput;
73
+ private handleFeedInput;
74
+ private handleTaskInput;
75
+ private getDetailTasks;
76
+ private getSessionBuffer;
77
+ private getTaskBuffer;
78
+ private appendBufferText;
79
+ private renderMarkdownLines;
80
+ private renderStreamLines;
81
+ private buildTopTabs;
82
+ private fetchJson;
83
+ private refreshList;
84
+ private refreshDetail;
85
+ private updateFeedFromList;
86
+ private syncSseStreams;
87
+ private startSseStream;
88
+ private consumeSseBuffer;
89
+ private handleSseEvent;
90
+ private applyHydration;
91
+ private applyStreamProjection;
92
+ private captureStreamContent;
93
+ private formatEventFeedLine;
94
+ private getSessionLabel;
95
+ private getFeedEntries;
96
+ private pushFeed;
97
+ private pushSessionFeed;
98
+ private formatStreamLine;
99
+ private getTaskFeedKey;
100
+ private renderListScreen;
101
+ private renderDetailScreen;
102
+ private renderFeedScreen;
103
+ private renderTaskScreen;
104
+ private contentLine;
105
+ }
106
+ export {};
107
+ //# sourceMappingURL=hub-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-overlay.d.ts","sourceRoot":"","sources":["../src/hub-overlay.ts"],"names":[],"mappings":"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"}