@indianic/dialout 1.10.0 → 1.12.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.
- package/README.md +14 -0
- package/dist/ai-adapters/claude.d.ts.map +1 -1
- package/dist/ai-adapters/claude.js +18 -1
- package/dist/ai-adapters/claude.js.map +1 -1
- package/dist/ai-sessions.d.ts +26 -1
- package/dist/ai-sessions.d.ts.map +1 -1
- package/dist/ai-sessions.js +43 -7
- package/dist/ai-sessions.js.map +1 -1
- package/dist/cli-client.d.ts +60 -0
- package/dist/cli-client.d.ts.map +1 -0
- package/dist/cli-client.js +246 -0
- package/dist/cli-client.js.map +1 -0
- package/dist/cli-terminal.d.ts +101 -0
- package/dist/cli-terminal.d.ts.map +1 -0
- package/dist/cli-terminal.js +1121 -0
- package/dist/cli-terminal.js.map +1 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +1 -1
- package/dist/file-transfer.d.ts +18 -0
- package/dist/file-transfer.d.ts.map +1 -0
- package/dist/file-transfer.js +266 -0
- package/dist/file-transfer.js.map +1 -0
- package/dist/fs-browser.d.ts +3 -1
- package/dist/fs-browser.d.ts.map +1 -1
- package/dist/fs-browser.js +35 -6
- package/dist/fs-browser.js.map +1 -1
- package/dist/mcp-stdio.d.ts +10 -0
- package/dist/mcp-stdio.d.ts.map +1 -0
- package/dist/mcp-stdio.js +199 -0
- package/dist/mcp-stdio.js.map +1 -0
- package/dist/shared-shell.d.ts +77 -0
- package/dist/shared-shell.d.ts.map +1 -0
- package/dist/shared-shell.js +282 -0
- package/dist/shared-shell.js.map +1 -0
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +413 -1
- package/dist/websocket.js.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/ai-chat-prefs.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/ai-chat-prefs.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/ai-chat-prefs.test.js +38 -0
- package/node_modules/@indianic/dialout-shared/dist/attachments.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/attachments.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/attachments.test.js +31 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.d.ts +27 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.js +23 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/captured.test.js +27 -0
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.d.ts +6 -0
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.d.ts.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.js +15 -4
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/chat-blocks.test.js +81 -0
- package/node_modules/@indianic/dialout-shared/dist/command-filter.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/command-filter.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/command-filter.test.js +63 -0
- package/node_modules/@indianic/dialout-shared/dist/composer-behaviour.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/composer-behaviour.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/composer-behaviour.test.js +27 -0
- package/node_modules/@indianic/dialout-shared/dist/event-merge.d.ts +7 -0
- package/node_modules/@indianic/dialout-shared/dist/event-merge.d.ts.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/event-merge.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/event-merge.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/event-merge.test.js +66 -0
- package/node_modules/@indianic/dialout-shared/dist/events.d.ts +1 -0
- package/node_modules/@indianic/dialout-shared/dist/events.d.ts.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/index.d.ts +6 -1
- package/node_modules/@indianic/dialout-shared/dist/index.d.ts.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/index.js +15 -1
- package/node_modules/@indianic/dialout-shared/dist/notices.d.ts +37 -0
- package/node_modules/@indianic/dialout-shared/dist/notices.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/notices.js +124 -0
- package/node_modules/@indianic/dialout-shared/dist/notices.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/notices.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/notices.test.js +92 -0
- package/node_modules/@indianic/dialout-shared/dist/notify.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/notify.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/notify.test.js +51 -0
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.d.ts +17 -0
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.d.ts.map +1 -1
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.js +27 -0
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/pane-prompt.test.js +184 -0
- package/node_modules/@indianic/dialout-shared/dist/scroll-pin.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/scroll-pin.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/scroll-pin.test.js +21 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.d.ts +9 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.js +38 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/thinking.test.js +30 -0
- package/node_modules/@indianic/dialout-shared/dist/tmux-prefs.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/tmux-prefs.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/tmux-prefs.test.js +95 -0
- package/node_modules/@indianic/dialout-shared/dist/tool-appearance.test.d.ts +2 -0
- package/node_modules/@indianic/dialout-shared/dist/tool-appearance.test.d.ts.map +1 -0
- package/node_modules/@indianic/dialout-shared/dist/tool-appearance.test.js +38 -0
- package/node_modules/@indianic/dialout-shared/package.json +2 -2
- package/node_modules/@indianic/dialout-shared/src/captured.test.ts +29 -0
- package/node_modules/@indianic/dialout-shared/src/captured.ts +46 -0
- package/node_modules/@indianic/dialout-shared/src/chat-blocks.test.ts +14 -0
- package/node_modules/@indianic/dialout-shared/src/chat-blocks.ts +14 -5
- package/node_modules/@indianic/dialout-shared/src/event-merge.test.ts +27 -0
- package/node_modules/@indianic/dialout-shared/src/event-merge.ts +11 -0
- package/node_modules/@indianic/dialout-shared/src/events.ts +5 -1
- package/node_modules/@indianic/dialout-shared/src/index.ts +8 -1
- package/node_modules/@indianic/dialout-shared/src/notices.test.ts +102 -0
- package/node_modules/@indianic/dialout-shared/src/notices.ts +159 -0
- package/node_modules/@indianic/dialout-shared/src/pane-prompt.test.ts +23 -1
- package/node_modules/@indianic/dialout-shared/src/pane-prompt.ts +27 -0
- package/node_modules/@indianic/dialout-shared/src/thinking.test.ts +32 -0
- package/node_modules/@indianic/dialout-shared/src/thinking.ts +32 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const attachments_1 = require("./attachments");
|
|
5
|
+
const P1 = '/Users/me/.dialout/attachments/2026-10-21/a1b2c3d4-shot.png';
|
|
6
|
+
const P2 = '/Users/me/.dialout/attachments/2026-10-21/0f0f0f0f-spec.pdf';
|
|
7
|
+
(0, vitest_1.describe)('attachments', () => {
|
|
8
|
+
(0, vitest_1.it)('makes names safe for disk and for a CLI line', () => {
|
|
9
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('Screen Shot 2026-10-21 at 3.04 PM.PNG')).toBe('Screen-Shot-2026-10-21-at-3.04-PM.png');
|
|
10
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('../../etc/passwd')).toBe('passwd');
|
|
11
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('.env')).toBe('env');
|
|
12
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('')).toBe('file');
|
|
13
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('a'.repeat(200) + '.jpeg').length).toBeLessThanOrEqual(80);
|
|
14
|
+
(0, vitest_1.expect)((0, attachments_1.safeAttachmentName)('résumé (final).pdf')).toBe('resume-final.pdf');
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.it)('references files the way each CLI reads them, on one line', () => {
|
|
17
|
+
(0, vitest_1.expect)((0, attachments_1.composeWithAttachments)('claude', 'Fix this\nlayout', [P1])).toBe(`Fix this layout @${P1}`);
|
|
18
|
+
(0, vitest_1.expect)((0, attachments_1.composeWithAttachments)('codex', 'Look', [P1, P2])).toBe(`Look (attached: ${P1}, ${P2})`);
|
|
19
|
+
(0, vitest_1.expect)((0, attachments_1.composeWithAttachments)('claude', '', [P1])).toBe(`@${P1}`);
|
|
20
|
+
(0, vitest_1.expect)((0, attachments_1.composeWithAttachments)('grok', 'hi', [])).toBe('hi');
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)('turns references back into chips, leaving other paths alone', () => {
|
|
23
|
+
const a = (0, attachments_1.splitAttachments)((0, attachments_1.composeWithAttachments)('claude', 'Fix /src/app.ts please', [P1, P2]));
|
|
24
|
+
(0, vitest_1.expect)(a.text).toBe('Fix /src/app.ts please');
|
|
25
|
+
(0, vitest_1.expect)(a.files.map((f) => [f.name, f.image])).toEqual([['shot.png', true], ['spec.pdf', false]]);
|
|
26
|
+
const b = (0, attachments_1.splitAttachments)((0, attachments_1.composeWithAttachments)('codex', 'Look', [P1]));
|
|
27
|
+
(0, vitest_1.expect)(b.text).toBe('Look');
|
|
28
|
+
(0, vitest_1.expect)(b.files[0].path).toBe(P1);
|
|
29
|
+
(0, vitest_1.expect)((0, attachments_1.splitAttachments)('nothing here (attached: soon)').text).toBe('nothing here (attached: soon)');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AiEvent } from './events';
|
|
2
|
+
export interface CapturedTranscript {
|
|
3
|
+
/** The transcript file this conversation is, or '' when nothing is captured. */
|
|
4
|
+
sessionKey: string;
|
|
5
|
+
events: AiEvent[];
|
|
6
|
+
/** Absolute index of events[0]; null when there are none. */
|
|
7
|
+
firstSeq: number | null;
|
|
8
|
+
/** Captured events older than firstSeq — what "load earlier" can still reach. */
|
|
9
|
+
earlier: number;
|
|
10
|
+
/** Absolute index of the last event held, for an open's `haveThrough`. */
|
|
11
|
+
lastSeq: number | null;
|
|
12
|
+
/** When the capture last grew, so a screen can say how fresh the copy is. */
|
|
13
|
+
updatedAt: string | null;
|
|
14
|
+
}
|
|
15
|
+
export declare const EMPTY_CAPTURE: CapturedTranscript;
|
|
16
|
+
/** A page of captured events is at most a replay's worth, never less than one. */
|
|
17
|
+
export declare const MAX_CAPTURE_PAGE = 200;
|
|
18
|
+
/**
|
|
19
|
+
* Clamp a ?before=&limit= pair off the wire. `before` is exclusive and absent
|
|
20
|
+
* means "the newest page"; 0 is a legitimate index, so only a non-integer or a
|
|
21
|
+
* negative number counts as absent.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseCapturePage(before: unknown, limit: unknown): {
|
|
24
|
+
before: number | null;
|
|
25
|
+
limit: number;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=captured.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captured.d.ts","sourceRoot":"","sources":["../src/captured.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAYxC,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,EAAE,kBAE3B,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,MAAe,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO1G"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_CAPTURE_PAGE = exports.EMPTY_CAPTURE = void 0;
|
|
4
|
+
exports.parseCapturePage = parseCapturePage;
|
|
5
|
+
const session_1 = require("./session");
|
|
6
|
+
exports.EMPTY_CAPTURE = {
|
|
7
|
+
sessionKey: '', events: [], firstSeq: null, earlier: 0, lastSeq: null, updatedAt: null,
|
|
8
|
+
};
|
|
9
|
+
/** A page of captured events is at most a replay's worth, never less than one. */
|
|
10
|
+
exports.MAX_CAPTURE_PAGE = session_1.REPLAY_LIMIT;
|
|
11
|
+
/**
|
|
12
|
+
* Clamp a ?before=&limit= pair off the wire. `before` is exclusive and absent
|
|
13
|
+
* means "the newest page"; 0 is a legitimate index, so only a non-integer or a
|
|
14
|
+
* negative number counts as absent.
|
|
15
|
+
*/
|
|
16
|
+
function parseCapturePage(before, limit) {
|
|
17
|
+
const b = Number(before);
|
|
18
|
+
const l = Math.floor(Number(limit));
|
|
19
|
+
return {
|
|
20
|
+
before: Number.isInteger(b) && b > 0 ? b : null,
|
|
21
|
+
limit: Number.isFinite(l) && l > 0 ? Math.min(l, exports.MAX_CAPTURE_PAGE) : exports.MAX_CAPTURE_PAGE,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captured.test.d.ts","sourceRoot":"","sources":["../src/captured.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const captured_1 = require("./captured");
|
|
5
|
+
(0, vitest_1.describe)('parseCapturePage', () => {
|
|
6
|
+
(0, vitest_1.it)('defaults to the newest full page', () => {
|
|
7
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)(null, null)).toEqual({ before: null, limit: captured_1.MAX_CAPTURE_PAGE });
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.it)('caps the page so one request cannot pull a whole conversation', () => {
|
|
10
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)(null, String(captured_1.MAX_CAPTURE_PAGE * 10)).limit).toBe(captured_1.MAX_CAPTURE_PAGE);
|
|
11
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)(null, '25').limit).toBe(25);
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.it)('treats junk, zero and negative limits as the default', () => {
|
|
14
|
+
for (const v of ['0', '-5', 'all', '', 'NaN', null, undefined]) {
|
|
15
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)(null, v).limit).toBe(captured_1.MAX_CAPTURE_PAGE);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('reads `before` only as a positive whole index', () => {
|
|
19
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)('450', null).before).toBe(450);
|
|
20
|
+
// seq 0 is the first event ever; "before 0" is empty, which is the same
|
|
21
|
+
// request as "the newest page" would be wrong — so it is not honoured.
|
|
22
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)('0', null).before).toBeNull();
|
|
23
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)('-1', null).before).toBeNull();
|
|
24
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)('12.5', null).before).toBeNull();
|
|
25
|
+
(0, vitest_1.expect)((0, captured_1.parseCapturePage)('abc', null).before).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AiEvent } from './events';
|
|
2
|
+
import { type MessageNotice } from './notices';
|
|
2
3
|
export interface ToolItem {
|
|
3
4
|
id: string;
|
|
4
5
|
name: string;
|
|
@@ -24,6 +25,11 @@ export type ChatBlock = {
|
|
|
24
25
|
kind: 'thinking';
|
|
25
26
|
key: string;
|
|
26
27
|
text: string;
|
|
28
|
+
ms?: number;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'notice';
|
|
31
|
+
key: string;
|
|
32
|
+
notice: MessageNotice;
|
|
27
33
|
} | {
|
|
28
34
|
kind: 'status';
|
|
29
35
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-blocks.d.ts","sourceRoot":"","sources":["../src/chat-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-blocks.d.ts","sourceRoot":"","sources":["../src/chat-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAM,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAK,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAI,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAI,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvD,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAiE1D;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAE9D"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.groupEvents = groupEvents;
|
|
4
4
|
exports.toolGroupStartsOpen = toolGroupStartsOpen;
|
|
5
|
+
const notices_1 = require("./notices");
|
|
5
6
|
// Grouping only ever merges ADJACENT events, so the worst case for an adapter
|
|
6
7
|
// that interleaves is two blocks instead of one — never a reordering.
|
|
7
8
|
function groupEvents(events) {
|
|
@@ -11,9 +12,19 @@ function groupEvents(events) {
|
|
|
11
12
|
const key = `${('id' in e && e.id) || ('forId' in e && e.forId) || e.kind}-${i}`;
|
|
12
13
|
const tail = blocks[blocks.length - 1];
|
|
13
14
|
if (e.kind === 'message') {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if (e.role !== 'user') {
|
|
16
|
+
blocks.push({ kind: 'assistant', key, text: e.text || '' });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Half the "user" messages in an agent transcript are the harness
|
|
20
|
+
// talking to itself. Read the frame before drawing a bubble for it.
|
|
21
|
+
const read = (0, notices_1.readUserMessage)(e.text || '');
|
|
22
|
+
if (read.kind === 'hidden')
|
|
23
|
+
return;
|
|
24
|
+
if (read.kind === 'notice')
|
|
25
|
+
blocks.push({ kind: 'notice', key, notice: read.notice });
|
|
26
|
+
else
|
|
27
|
+
blocks.push({ kind: 'user', key, text: read.text });
|
|
17
28
|
return;
|
|
18
29
|
}
|
|
19
30
|
if (e.kind === 'tool_call') {
|
|
@@ -47,7 +58,7 @@ function groupEvents(events) {
|
|
|
47
58
|
return; // orphan result: drop it rather than invent a row
|
|
48
59
|
}
|
|
49
60
|
if (e.kind === 'thinking') {
|
|
50
|
-
blocks.push({ kind: 'thinking', key, text: e.text || '' });
|
|
61
|
+
blocks.push({ kind: 'thinking', key, text: e.text || '', ms: e.ms });
|
|
51
62
|
return;
|
|
52
63
|
}
|
|
53
64
|
if (e.kind === 'state') {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-blocks.test.d.ts","sourceRoot":"","sources":["../src/chat-blocks.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const chat_blocks_1 = require("./chat-blocks");
|
|
5
|
+
const call = (id, name) => ({ kind: 'tool_call', id, name, summary: `${name} thing` });
|
|
6
|
+
const result = (forId, ok = true) => ({ kind: 'tool_result', forId, ok, preview: 'line1\nline2' });
|
|
7
|
+
const msg = (role, text, id = text) => ({ kind: 'message', role, text, id });
|
|
8
|
+
(0, vitest_1.describe)('groupEvents', () => {
|
|
9
|
+
(0, vitest_1.it)('merges consecutive tool calls into one block', () => {
|
|
10
|
+
const blocks = (0, chat_blocks_1.groupEvents)([call('a', 'Read'), call('b', 'Bash')]);
|
|
11
|
+
(0, vitest_1.expect)(blocks).toHaveLength(1);
|
|
12
|
+
(0, vitest_1.expect)(blocks[0].kind).toBe('tools');
|
|
13
|
+
if (blocks[0].kind === 'tools')
|
|
14
|
+
(0, vitest_1.expect)(blocks[0].items).toHaveLength(2);
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.it)('splits tool blocks when a message comes between them', () => {
|
|
17
|
+
const blocks = (0, chat_blocks_1.groupEvents)([
|
|
18
|
+
call('a', 'Read'), msg('assistant', 'hello'), call('b', 'Bash'),
|
|
19
|
+
]);
|
|
20
|
+
(0, vitest_1.expect)(blocks.map((b) => b.kind)).toEqual(['tools', 'assistant', 'tools']);
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)('attaches a result to its call by forId', () => {
|
|
23
|
+
const blocks = (0, chat_blocks_1.groupEvents)([call('a', 'Read'), call('b', 'Bash'), result('a', false)]);
|
|
24
|
+
if (blocks[0].kind !== 'tools')
|
|
25
|
+
throw new Error('expected tools');
|
|
26
|
+
(0, vitest_1.expect)(blocks[0].items[0].ok).toBe(false);
|
|
27
|
+
(0, vitest_1.expect)(blocks[0].items[0].resultLines).toBe(2);
|
|
28
|
+
(0, vitest_1.expect)(blocks[0].items[1].ok).toBe(null); // no result yet
|
|
29
|
+
});
|
|
30
|
+
// A result whose call was never seen must not crash or invent a row.
|
|
31
|
+
(0, vitest_1.it)('ignores an orphan result', () => {
|
|
32
|
+
(0, vitest_1.expect)((0, chat_blocks_1.groupEvents)([result('nope')])).toHaveLength(0);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('keeps a lone tool call', () => {
|
|
35
|
+
const blocks = (0, chat_blocks_1.groupEvents)([call('a', 'Read')]);
|
|
36
|
+
(0, vitest_1.expect)(blocks).toHaveLength(1);
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('collapses repeated identical statuses to one divider', () => {
|
|
39
|
+
const blocks = (0, chat_blocks_1.groupEvents)([
|
|
40
|
+
{ kind: 'state', status: 'working' },
|
|
41
|
+
{ kind: 'state', status: 'working' },
|
|
42
|
+
{ kind: 'state', status: 'waiting_approval' },
|
|
43
|
+
]);
|
|
44
|
+
(0, vitest_1.expect)(blocks.map((b) => b.kind)).toEqual(['status', 'status']);
|
|
45
|
+
if (blocks[1].kind === 'status')
|
|
46
|
+
(0, vitest_1.expect)(blocks[1].status).toBe('waiting_approval');
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('separates user and assistant messages into their own blocks', () => {
|
|
49
|
+
const blocks = (0, chat_blocks_1.groupEvents)([msg('user', 'hi'), msg('assistant', 'hello')]);
|
|
50
|
+
(0, vitest_1.expect)(blocks.map((b) => b.kind)).toEqual(['user', 'assistant']);
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)('turns a harness message into a notice, and drops a pure reminder', () => {
|
|
53
|
+
const blocks = (0, chat_blocks_1.groupEvents)([
|
|
54
|
+
msg('user', 'ship it'),
|
|
55
|
+
msg('user', '<system-reminder>read the rules again</system-reminder>'),
|
|
56
|
+
msg('user', '<task-notification><summary>Agent "Review" finished</summary>'
|
|
57
|
+
+ '<usage><tool_uses>8</tool_uses><duration_ms>77347</duration_ms></usage></task-notification>'),
|
|
58
|
+
]);
|
|
59
|
+
(0, vitest_1.expect)(blocks.map((b) => b.kind)).toEqual(['user', 'notice']);
|
|
60
|
+
const notice = blocks[1];
|
|
61
|
+
if (notice.kind !== 'notice')
|
|
62
|
+
throw new Error('expected a notice');
|
|
63
|
+
(0, vitest_1.expect)(notice.notice.label).toBe('Agent "Review" finished');
|
|
64
|
+
(0, vitest_1.expect)(notice.notice.detail).toBe('1m 17s · 8 tools');
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('gives every block a stable unique key', () => {
|
|
67
|
+
const blocks = (0, chat_blocks_1.groupEvents)([msg('user', 'hi'), call('a', 'Read'), call('b', 'Bash')]);
|
|
68
|
+
const keys = blocks.map((b) => b.key);
|
|
69
|
+
(0, vitest_1.expect)(new Set(keys).size).toBe(keys.length);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.describe)('toolGroupStartsOpen', () => {
|
|
73
|
+
const item = (ok) => ({ id: 'x', name: 'Bash', summary: '', ok, resultPreview: null, resultLines: null });
|
|
74
|
+
(0, vitest_1.it)('is closed for successes and calls still running', () => {
|
|
75
|
+
(0, vitest_1.expect)((0, chat_blocks_1.toolGroupStartsOpen)([item(true), item(null)])).toBe(false);
|
|
76
|
+
(0, vitest_1.expect)((0, chat_blocks_1.toolGroupStartsOpen)([])).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('is open as soon as one item failed', () => {
|
|
79
|
+
(0, vitest_1.expect)((0, chat_blocks_1.toolGroupStartsOpen)([item(true), item(false)])).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-filter.test.d.ts","sourceRoot":"","sources":["../src/command-filter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const command_filter_1 = require("./command-filter");
|
|
5
|
+
const cmd = (name, source, description = '') => ({ name, source, description });
|
|
6
|
+
(0, vitest_1.describe)('commandQuery', () => {
|
|
7
|
+
(0, vitest_1.it)('opens on a lone slash', () => {
|
|
8
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('/')).toBe('');
|
|
9
|
+
});
|
|
10
|
+
(0, vitest_1.it)('returns the text after the slash', () => {
|
|
11
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('/comp')).toBe('comp');
|
|
12
|
+
});
|
|
13
|
+
// A slash mid-sentence is a path or a date, not a command.
|
|
14
|
+
(0, vitest_1.it)('does not open for a slash that is not first', () => {
|
|
15
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('what about /tmp')).toBe(null);
|
|
16
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)(' /leading-space')).toBe(null);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('closes once the command is complete', () => {
|
|
19
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('/compact now')).toBe(null);
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('is closed for ordinary text and for empty input', () => {
|
|
22
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('')).toBe(null);
|
|
23
|
+
(0, vitest_1.expect)((0, command_filter_1.commandQuery)('hello')).toBe(null);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.describe)('rankCommands', () => {
|
|
27
|
+
const all = [
|
|
28
|
+
cmd('code-review:code-review', 'plugin', 'Review a PR'),
|
|
29
|
+
cmd('compact', 'builtin', 'Compact conversation history'),
|
|
30
|
+
cmd('commit-commands:clean_gone', 'plugin', 'Delete merged branches'),
|
|
31
|
+
cmd('seo', 'user', 'SEO Machine'),
|
|
32
|
+
cmd('deploy', 'project', 'Ship it'),
|
|
33
|
+
];
|
|
34
|
+
(0, vitest_1.it)('puts a name prefix match above a name substring above a description match', () => {
|
|
35
|
+
const names = (0, command_filter_1.rankCommands)(all, 'co').map((c) => c.name);
|
|
36
|
+
(0, vitest_1.expect)(names[0]).toBe('compact'); // prefix on the bare name
|
|
37
|
+
(0, vitest_1.expect)(names).toContain('code-review:code-review');
|
|
38
|
+
(0, vitest_1.expect)(names).not.toContain('seo');
|
|
39
|
+
});
|
|
40
|
+
// 52 of 81 commands are plugin-namespaced, so the prefix has to be searchable
|
|
41
|
+
// or half the list is unreachable by typing.
|
|
42
|
+
(0, vitest_1.it)('matches the plugin namespace as well as the command name', () => {
|
|
43
|
+
const names = (0, command_filter_1.rankCommands)(all, 'commit').map((c) => c.name);
|
|
44
|
+
(0, vitest_1.expect)(names).toContain('commit-commands:clean_gone');
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('matches a word in the description', () => {
|
|
47
|
+
const names = (0, command_filter_1.rankCommands)(all, 'branches').map((c) => c.name);
|
|
48
|
+
(0, vitest_1.expect)(names).toEqual(['commit-commands:clean_gone']);
|
|
49
|
+
});
|
|
50
|
+
// Plugins outnumber the user's own commands 52:29, so a purely alphabetical
|
|
51
|
+
// sort buries the ones they wrote.
|
|
52
|
+
(0, vitest_1.it)('breaks ties by source, user first and plugin last', () => {
|
|
53
|
+
const tie = [cmd('zzz', 'plugin'), cmd('zzz2', 'user'), cmd('zzz3', 'project')];
|
|
54
|
+
(0, vitest_1.expect)((0, command_filter_1.rankCommands)(tie, 'zzz').map((c) => c.source)).toEqual(['user', 'project', 'plugin']);
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('an empty query returns everything, still ranked by source', () => {
|
|
57
|
+
(0, vitest_1.expect)((0, command_filter_1.rankCommands)(all, '')).toHaveLength(5);
|
|
58
|
+
(0, vitest_1.expect)((0, command_filter_1.rankCommands)(all, '')[0].source).toBe('user');
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.it)('is case insensitive', () => {
|
|
61
|
+
(0, vitest_1.expect)((0, command_filter_1.rankCommands)(all, 'SEO').map((c) => c.name)).toEqual(['seo']);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-behaviour.test.d.ts","sourceRoot":"","sources":["../src/composer-behaviour.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const composer_behaviour_1 = require("./composer-behaviour");
|
|
5
|
+
const k = (key, shiftKey = false) => ({ key, shiftKey });
|
|
6
|
+
(0, vitest_1.describe)('shouldSubmitOnEnter', () => {
|
|
7
|
+
(0, vitest_1.it)('sends on Enter where there is a real keyboard', () => {
|
|
8
|
+
(0, vitest_1.expect)((0, composer_behaviour_1.shouldSubmitOnEnter)(k('Enter'), false)).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
// On a touch device the on-screen Enter is conventionally a newline, and a
|
|
11
|
+
// stray one would fire a half-typed message.
|
|
12
|
+
(0, vitest_1.it)('never sends on Enter on a coarse pointer', () => {
|
|
13
|
+
(0, vitest_1.expect)((0, composer_behaviour_1.shouldSubmitOnEnter)(k('Enter'), true)).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('Shift+Enter is always a newline', () => {
|
|
16
|
+
(0, vitest_1.expect)((0, composer_behaviour_1.shouldSubmitOnEnter)(k('Enter', true), false)).toBe(false);
|
|
17
|
+
(0, vitest_1.expect)((0, composer_behaviour_1.shouldSubmitOnEnter)(k('Enter', true), true)).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('ignores every other key', () => {
|
|
20
|
+
for (const key of ['a', 'Escape', 'Tab', 'NumpadEnter']) {
|
|
21
|
+
(0, vitest_1.expect)((0, composer_behaviour_1.shouldSubmitOnEnter)(k(key), false)).toBe(false);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('exposes the media query it is paired with', () => {
|
|
25
|
+
(0, vitest_1.expect)(composer_behaviour_1.COARSE_POINTER_QUERY).toBe('(pointer: coarse)');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -10,6 +10,13 @@ export interface TranscriptState {
|
|
|
10
10
|
export interface EventsMeta {
|
|
11
11
|
replay?: boolean;
|
|
12
12
|
history?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* This message answers an open that declared `haveThrough`: it carries only
|
|
15
|
+
* what came after it. Merged as an append, but unlike a live batch it must
|
|
16
|
+
* not disturb `earlier` — the client's own count came from the database and
|
|
17
|
+
* reaches further back than the agent's in-memory window does.
|
|
18
|
+
*/
|
|
19
|
+
delta?: boolean;
|
|
13
20
|
firstSeq?: number;
|
|
14
21
|
earlier?: number;
|
|
15
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-merge.d.ts","sourceRoot":"","sources":["../src/event-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"event-merge.d.ts","sourceRoot":"","sources":["../src/event-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAqBxC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,gBAAgB,EAAE,eAA4D,CAAC;AAE5F,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,eAAe,CA0B/G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-merge.test.d.ts","sourceRoot":"","sources":["../src/event-merge.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const event_merge_1 = require("./event-merge");
|
|
5
|
+
const ev = (n) => ({ kind: 'message', role: 'user', text: `m${n}`, id: `m${n}` });
|
|
6
|
+
const range = (a, b) => Array.from({ length: b - a }, (_, i) => ev(a + i));
|
|
7
|
+
const texts = (s) => s.events.map((e) => e.text);
|
|
8
|
+
(0, vitest_1.describe)('mergeEvents', () => {
|
|
9
|
+
(0, vitest_1.it)('replay replaces, so a reconnect never duplicates history', () => {
|
|
10
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(250, 450), { replay: true, firstSeq: 250, earlier: 250 });
|
|
11
|
+
s = (0, event_merge_1.mergeEvents)(s, range(250, 450), { replay: true, firstSeq: 250, earlier: 250 });
|
|
12
|
+
(0, vitest_1.expect)(s.events).toHaveLength(200);
|
|
13
|
+
(0, vitest_1.expect)(s).toMatchObject({ firstSeq: 250, earlier: 250 });
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('history prepends only what is not held', () => {
|
|
16
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(250, 450), { replay: true, firstSeq: 250, earlier: 250 });
|
|
17
|
+
s = (0, event_merge_1.mergeEvents)(s, range(50, 250), { history: true, firstSeq: 50, earlier: 50 });
|
|
18
|
+
(0, vitest_1.expect)(texts(s)[0]).toBe('m50');
|
|
19
|
+
(0, vitest_1.expect)(s.events).toHaveLength(400);
|
|
20
|
+
// The same page again (double tap, or another device) changes nothing.
|
|
21
|
+
(0, vitest_1.expect)((0, event_merge_1.mergeEvents)(s, range(50, 250), { history: true, firstSeq: 50, earlier: 50 })).toBe(s);
|
|
22
|
+
// An overlapping page keeps only the older part.
|
|
23
|
+
s = (0, event_merge_1.mergeEvents)(s, range(0, 100), { history: true, firstSeq: 0, earlier: 0 });
|
|
24
|
+
(0, vitest_1.expect)(texts(s).slice(0, 51)).toEqual(range(0, 51).map((e) => e.text));
|
|
25
|
+
(0, vitest_1.expect)(s.events).toHaveLength(450);
|
|
26
|
+
(0, vitest_1.expect)(s.earlier).toBe(0);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('live appends and trims overlap with the tail', () => {
|
|
29
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(0, 3), { replay: true, firstSeq: 0, earlier: 0 });
|
|
30
|
+
s = (0, event_merge_1.mergeEvents)(s, range(2, 5), { firstSeq: 2 });
|
|
31
|
+
(0, vitest_1.expect)(texts(s)).toEqual(['m0', 'm1', 'm2', 'm3', 'm4']);
|
|
32
|
+
(0, vitest_1.expect)((0, event_merge_1.mergeEvents)(s, range(3, 5), { firstSeq: 3 })).toBe(s);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('a delta appends onto the captured copy and leaves `earlier` alone', () => {
|
|
35
|
+
// What the session screen painted from the server's database: 200 events
|
|
36
|
+
// ending at seq 449, with 250 older ones still stored behind them.
|
|
37
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(250, 450), { replay: true, firstSeq: 250, earlier: 250 });
|
|
38
|
+
// The open declared haveThrough: 449; the agent answers with 450 onwards.
|
|
39
|
+
s = (0, event_merge_1.mergeEvents)(s, range(450, 453), { delta: true, firstSeq: 450 });
|
|
40
|
+
(0, vitest_1.expect)(texts(s)).toHaveLength(203);
|
|
41
|
+
(0, vitest_1.expect)(texts(s)[202]).toBe('m452');
|
|
42
|
+
(0, vitest_1.expect)(s.firstSeq).toBe(250);
|
|
43
|
+
// The agent's window reaches back less far than the database does, so it
|
|
44
|
+
// sends no `earlier` and the client's own count must survive.
|
|
45
|
+
(0, vitest_1.expect)(s.earlier).toBe(250);
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('an empty delta is the in-sync signal and changes nothing', () => {
|
|
48
|
+
const s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(0, 3), { replay: true, firstSeq: 0, earlier: 7 });
|
|
49
|
+
(0, vitest_1.expect)((0, event_merge_1.mergeEvents)(s, [], { delta: true, firstSeq: 3 })).toBe(s);
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('a delta that overlaps the tail is trimmed, not doubled', () => {
|
|
52
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(0, 5), { replay: true, firstSeq: 0, earlier: 0 });
|
|
53
|
+
// A race: the live tail already delivered m5 before the open was answered.
|
|
54
|
+
s = (0, event_merge_1.mergeEvents)(s, range(5, 6), { firstSeq: 5 });
|
|
55
|
+
s = (0, event_merge_1.mergeEvents)(s, range(3, 7), { delta: true, firstSeq: 3 });
|
|
56
|
+
(0, vitest_1.expect)(texts(s)).toEqual(['m0', 'm1', 'm2', 'm3', 'm4', 'm5', 'm6']);
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('an agent without paging is a plain append', () => {
|
|
59
|
+
let s = (0, event_merge_1.mergeEvents)(event_merge_1.EMPTY_TRANSCRIPT, range(0, 2));
|
|
60
|
+
s = (0, event_merge_1.mergeEvents)(s, range(2, 3));
|
|
61
|
+
(0, vitest_1.expect)(texts(s)).toEqual(['m0', 'm1', 'm2']);
|
|
62
|
+
(0, vitest_1.expect)(s.firstSeq).toBeNull();
|
|
63
|
+
// A history page cannot be placed without numbering, so it is ignored.
|
|
64
|
+
(0, vitest_1.expect)((0, event_merge_1.mergeEvents)(s, range(0, 1), { history: true, firstSeq: 0 })).toBe(s);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAEjF,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAK,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,IAAI,EAAE,WAAW,CAAC;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,eAAe,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAEjF,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAK,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,IAAI,EAAE,WAAW,CAAC;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAKjF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAI,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAO,MAAM,EAAE,QAAQ,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,SAAS;IAExB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAErC,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CACvC;AAKD,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
|
@@ -10,6 +10,8 @@ export type { CommandSource, AiCommand, McpServerInfo, AiCapabilities } from './
|
|
|
10
10
|
export { NOTIFY_COOLDOWN_MS, shouldNotifyAi, shouldNotifyPrompt } from './notify';
|
|
11
11
|
export type { ToolItem, ChatBlock } from './chat-blocks';
|
|
12
12
|
export { groupEvents, toolGroupStartsOpen } from './chat-blocks';
|
|
13
|
+
export type { MessageNotice, NoticeKind, ReadMessage } from './notices';
|
|
14
|
+
export { dedent, readUserMessage } from './notices';
|
|
13
15
|
export { PIN_THRESHOLD_PX, shouldFollow } from './scroll-pin';
|
|
14
16
|
export type { ToolClass, ToolAppearance } from './tool-appearance';
|
|
15
17
|
export { toolClass, toolAppearance } from './tool-appearance';
|
|
@@ -23,8 +25,11 @@ export type { TmuxPrefs, TmuxStatusPrefs } from './tmux-prefs';
|
|
|
23
25
|
export { DEFAULT_TMUX_PREFS, STATUS_TOKENS, MAX_STATUS_TEMPLATE, compileStatusTemplate, isValidStatusTemplate, isValidTmuxColor, resolveTmuxPrefs, } from './tmux-prefs';
|
|
24
26
|
export type { TranscriptState, EventsMeta } from './event-merge';
|
|
25
27
|
export { EMPTY_TRANSCRIPT, mergeEvents } from './event-merge';
|
|
28
|
+
export type { CapturedTranscript } from './captured';
|
|
29
|
+
export { EMPTY_CAPTURE, MAX_CAPTURE_PAGE, parseCapturePage } from './captured';
|
|
30
|
+
export { thinkingDuration, thinkingLabel } from './thinking';
|
|
26
31
|
export type { PanePrompt, PanePromptOption, PromptKey } from './pane-prompt';
|
|
27
|
-
export { PROMPT_KEYS, detectPanePrompt, isSafeKeyList, promptKeys } from './pane-prompt';
|
|
32
|
+
export { PROMPT_KEYS, detectPanePrompt, freeTextRow, isFreeTextOption, isSafeKeyList, promptKeys, promptMoveKeys } from './pane-prompt';
|
|
28
33
|
export type { AttachmentRef } from './attachments';
|
|
29
34
|
export { ATTACHMENT_DIR, ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, composeWithAttachments, isImageName, safeAttachmentName, splitAttachments, } from './attachments';
|
|
30
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAElD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAElE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAElF,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAErG,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExH,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EACtD,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,GACjF,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAElD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAElE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAElF,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEjE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAErG,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExH,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EACtD,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,gBAAgB,GACjF,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAExI,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAC1D,sBAAsB,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,GAC1E,MAAM,eAAe,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ATTACHMENT_MAX_BYTES = exports.ATTACHMENT_DIR = exports.promptMoveKeys = exports.promptKeys = exports.isSafeKeyList = exports.isFreeTextOption = exports.freeTextRow = exports.detectPanePrompt = exports.PROMPT_KEYS = exports.thinkingLabel = exports.thinkingDuration = exports.parseCapturePage = exports.MAX_CAPTURE_PAGE = exports.EMPTY_CAPTURE = exports.mergeEvents = exports.EMPTY_TRANSCRIPT = exports.resolveTmuxPrefs = exports.isValidTmuxColor = exports.isValidStatusTemplate = exports.compileStatusTemplate = exports.MAX_STATUS_TEMPLATE = exports.STATUS_TOKENS = exports.DEFAULT_TMUX_PREFS = exports.renderTerminalName = exports.factsFromSession = exports.TERMINAL_NAME_TOKENS = exports.DEFAULT_TERMINAL_TEMPLATE = exports.setFunctionKeysVisible = exports.getFunctionKeysVisible = exports.FUNCTION_KEYS_PREF = exports.shouldSubmitOnEnter = exports.COARSE_POINTER_QUERY = exports.rankCommands = exports.commandQuery = exports.toolAppearance = exports.toolClass = exports.shouldFollow = exports.PIN_THRESHOLD_PX = exports.readUserMessage = exports.dedent = exports.toolGroupStartsOpen = exports.groupEvents = exports.shouldNotifyPrompt = exports.shouldNotifyAi = exports.NOTIFY_COOLDOWN_MS = exports.REPLAY_LIMIT = exports.isPermissionMode = exports.PERMISSION_MODES = exports.preview = exports.PREVIEW_LIMIT = void 0;
|
|
4
|
+
exports.splitAttachments = exports.safeAttachmentName = exports.isImageName = exports.composeWithAttachments = exports.ATTACHMENT_MAX_FILES = void 0;
|
|
4
5
|
var events_1 = require("./events");
|
|
5
6
|
Object.defineProperty(exports, "PREVIEW_LIMIT", { enumerable: true, get: function () { return events_1.PREVIEW_LIMIT; } });
|
|
6
7
|
Object.defineProperty(exports, "preview", { enumerable: true, get: function () { return events_1.preview; } });
|
|
@@ -16,6 +17,9 @@ Object.defineProperty(exports, "shouldNotifyPrompt", { enumerable: true, get: fu
|
|
|
16
17
|
var chat_blocks_1 = require("./chat-blocks");
|
|
17
18
|
Object.defineProperty(exports, "groupEvents", { enumerable: true, get: function () { return chat_blocks_1.groupEvents; } });
|
|
18
19
|
Object.defineProperty(exports, "toolGroupStartsOpen", { enumerable: true, get: function () { return chat_blocks_1.toolGroupStartsOpen; } });
|
|
20
|
+
var notices_1 = require("./notices");
|
|
21
|
+
Object.defineProperty(exports, "dedent", { enumerable: true, get: function () { return notices_1.dedent; } });
|
|
22
|
+
Object.defineProperty(exports, "readUserMessage", { enumerable: true, get: function () { return notices_1.readUserMessage; } });
|
|
19
23
|
var scroll_pin_1 = require("./scroll-pin");
|
|
20
24
|
Object.defineProperty(exports, "PIN_THRESHOLD_PX", { enumerable: true, get: function () { return scroll_pin_1.PIN_THRESHOLD_PX; } });
|
|
21
25
|
Object.defineProperty(exports, "shouldFollow", { enumerable: true, get: function () { return scroll_pin_1.shouldFollow; } });
|
|
@@ -48,11 +52,21 @@ Object.defineProperty(exports, "resolveTmuxPrefs", { enumerable: true, get: func
|
|
|
48
52
|
var event_merge_1 = require("./event-merge");
|
|
49
53
|
Object.defineProperty(exports, "EMPTY_TRANSCRIPT", { enumerable: true, get: function () { return event_merge_1.EMPTY_TRANSCRIPT; } });
|
|
50
54
|
Object.defineProperty(exports, "mergeEvents", { enumerable: true, get: function () { return event_merge_1.mergeEvents; } });
|
|
55
|
+
var captured_1 = require("./captured");
|
|
56
|
+
Object.defineProperty(exports, "EMPTY_CAPTURE", { enumerable: true, get: function () { return captured_1.EMPTY_CAPTURE; } });
|
|
57
|
+
Object.defineProperty(exports, "MAX_CAPTURE_PAGE", { enumerable: true, get: function () { return captured_1.MAX_CAPTURE_PAGE; } });
|
|
58
|
+
Object.defineProperty(exports, "parseCapturePage", { enumerable: true, get: function () { return captured_1.parseCapturePage; } });
|
|
59
|
+
var thinking_1 = require("./thinking");
|
|
60
|
+
Object.defineProperty(exports, "thinkingDuration", { enumerable: true, get: function () { return thinking_1.thinkingDuration; } });
|
|
61
|
+
Object.defineProperty(exports, "thinkingLabel", { enumerable: true, get: function () { return thinking_1.thinkingLabel; } });
|
|
51
62
|
var pane_prompt_1 = require("./pane-prompt");
|
|
52
63
|
Object.defineProperty(exports, "PROMPT_KEYS", { enumerable: true, get: function () { return pane_prompt_1.PROMPT_KEYS; } });
|
|
53
64
|
Object.defineProperty(exports, "detectPanePrompt", { enumerable: true, get: function () { return pane_prompt_1.detectPanePrompt; } });
|
|
65
|
+
Object.defineProperty(exports, "freeTextRow", { enumerable: true, get: function () { return pane_prompt_1.freeTextRow; } });
|
|
66
|
+
Object.defineProperty(exports, "isFreeTextOption", { enumerable: true, get: function () { return pane_prompt_1.isFreeTextOption; } });
|
|
54
67
|
Object.defineProperty(exports, "isSafeKeyList", { enumerable: true, get: function () { return pane_prompt_1.isSafeKeyList; } });
|
|
55
68
|
Object.defineProperty(exports, "promptKeys", { enumerable: true, get: function () { return pane_prompt_1.promptKeys; } });
|
|
69
|
+
Object.defineProperty(exports, "promptMoveKeys", { enumerable: true, get: function () { return pane_prompt_1.promptMoveKeys; } });
|
|
56
70
|
var attachments_1 = require("./attachments");
|
|
57
71
|
Object.defineProperty(exports, "ATTACHMENT_DIR", { enumerable: true, get: function () { return attachments_1.ATTACHMENT_DIR; } });
|
|
58
72
|
Object.defineProperty(exports, "ATTACHMENT_MAX_BYTES", { enumerable: true, get: function () { return attachments_1.ATTACHMENT_MAX_BYTES; } });
|