@quantiya/codevibe-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +178 -0
  2. package/bin/codevibe.js +7 -0
  3. package/dist/appsync/appsync-client.d.ts +132 -0
  4. package/dist/appsync/appsync-client.js +568 -0
  5. package/dist/appsync/index.d.ts +2 -0
  6. package/dist/appsync/index.js +10 -0
  7. package/dist/appsync/queries.d.ts +16 -0
  8. package/dist/appsync/queries.js +189 -0
  9. package/dist/auth/auth-cli.d.ts +5 -0
  10. package/dist/auth/auth-cli.js +217 -0
  11. package/dist/auth/auth-service.d.ts +53 -0
  12. package/dist/auth/auth-service.js +310 -0
  13. package/dist/auth/index.d.ts +2 -0
  14. package/dist/auth/index.js +9 -0
  15. package/dist/config/config.d.ts +53 -0
  16. package/dist/config/config.js +123 -0
  17. package/dist/config/index.d.ts +2 -0
  18. package/dist/config/index.js +8 -0
  19. package/dist/crypto/crypto-service.d.ts +118 -0
  20. package/dist/crypto/crypto-service.js +284 -0
  21. package/dist/crypto/index.d.ts +1 -0
  22. package/dist/crypto/index.js +9 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.js +68 -0
  25. package/dist/keychain/index.d.ts +1 -0
  26. package/dist/keychain/index.js +8 -0
  27. package/dist/keychain/keychain-manager.d.ts +125 -0
  28. package/dist/keychain/keychain-manager.js +375 -0
  29. package/dist/logger/index.d.ts +1 -0
  30. package/dist/logger/index.js +8 -0
  31. package/dist/logger/logger.d.ts +35 -0
  32. package/dist/logger/logger.js +142 -0
  33. package/dist/prompt-parser.d.ts +39 -0
  34. package/dist/prompt-parser.js +236 -0
  35. package/dist/session/index.d.ts +2 -0
  36. package/dist/session/index.js +7 -0
  37. package/dist/session/session-resume.d.ts +55 -0
  38. package/dist/session/session-resume.js +151 -0
  39. package/dist/types/auth.d.ts +15 -0
  40. package/dist/types/auth.js +3 -0
  41. package/dist/types/encryption.d.ts +54 -0
  42. package/dist/types/encryption.js +3 -0
  43. package/dist/types/events.d.ts +74 -0
  44. package/dist/types/events.js +28 -0
  45. package/dist/types/index.d.ts +4 -0
  46. package/dist/types/index.js +22 -0
  47. package/dist/types/session.d.ts +59 -0
  48. package/dist/types/session.js +22 -0
  49. package/package.json +51 -0
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.logger = exports.Logger = void 0;
37
+ exports.createLogger = createLogger;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const LOG_LEVELS = {
42
+ debug: 0,
43
+ info: 1,
44
+ warn: 2,
45
+ error: 3,
46
+ };
47
+ /**
48
+ * Simple logger for CodeVibe plugins
49
+ */
50
+ class Logger {
51
+ constructor(options) {
52
+ this.name = options.name;
53
+ this.logFile = options.logFile;
54
+ this.level = options.level || 'info';
55
+ this.enableConsole = options.console ?? false;
56
+ if (this.logFile) {
57
+ this.ensureLogDir();
58
+ }
59
+ }
60
+ ensureLogDir() {
61
+ if (this.logFile) {
62
+ const dir = path.dirname(this.logFile);
63
+ if (!fs.existsSync(dir)) {
64
+ fs.mkdirSync(dir, { recursive: true });
65
+ }
66
+ }
67
+ }
68
+ shouldLog(level) {
69
+ return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
70
+ }
71
+ formatMessage(level, message, data) {
72
+ const timestamp = new Date().toISOString();
73
+ const levelStr = level.toUpperCase().padEnd(5);
74
+ let msg = `[${timestamp}] [${levelStr}] [${this.name}] ${message}`;
75
+ if (data !== undefined) {
76
+ if (typeof data === 'object') {
77
+ msg += ` ${JSON.stringify(data)}`;
78
+ }
79
+ else {
80
+ msg += ` ${data}`;
81
+ }
82
+ }
83
+ return msg;
84
+ }
85
+ log(level, message, data) {
86
+ if (!this.shouldLog(level)) {
87
+ return;
88
+ }
89
+ const formatted = this.formatMessage(level, message, data);
90
+ if (this.logFile) {
91
+ try {
92
+ fs.appendFileSync(this.logFile, formatted + '\n');
93
+ }
94
+ catch (error) {
95
+ // Ignore log write errors
96
+ }
97
+ }
98
+ if (this.enableConsole) {
99
+ switch (level) {
100
+ case 'error':
101
+ console.error(formatted);
102
+ break;
103
+ case 'warn':
104
+ console.warn(formatted);
105
+ break;
106
+ default:
107
+ console.log(formatted);
108
+ }
109
+ }
110
+ }
111
+ debug(message, data) {
112
+ this.log('debug', message, data);
113
+ }
114
+ info(message, data) {
115
+ this.log('info', message, data);
116
+ }
117
+ warn(message, data) {
118
+ this.log('warn', message, data);
119
+ }
120
+ error(message, data) {
121
+ this.log('error', message, data);
122
+ }
123
+ setLevel(level) {
124
+ this.level = level;
125
+ }
126
+ }
127
+ exports.Logger = Logger;
128
+ /**
129
+ * Create a logger with custom options
130
+ */
131
+ function createLogger(options) {
132
+ return new Logger(options);
133
+ }
134
+ /**
135
+ * Default shared logger instance
136
+ */
137
+ exports.logger = new Logger({
138
+ name: 'codevibe-core',
139
+ logFile: path.join(os.tmpdir(), 'codevibe-core.log'),
140
+ level: 'info',
141
+ });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEhBLG9DQUVDO0FBNUhELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBV3pCLE1BQU0sVUFBVSxHQUE2QjtJQUMzQyxLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBSSxFQUFFLENBQUM7SUFDUCxLQUFLLEVBQUUsQ0FBQztDQUNULENBQUM7QUFFRjs7R0FFRztBQUNILE1BQWEsTUFBTTtJQU1qQixZQUFZLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FB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QUMsT0FBc0I7SUFDakQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQztJQUMvQixJQUFJLEVBQUUsZUFBZTtJQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsbUJBQW1CLENBQUM7SUFDcEQsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG5pbnRlcmZhY2UgTG9nZ2VyT3B0aW9ucyB7XG4gIG5hbWU6IHN0cmluZztcbiAgbG9nRmlsZT86IHN0cmluZztcbiAgbGV2ZWw/OiBMb2dMZXZlbDtcbiAgY29uc29sZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IExPR19MRVZFTFM6IFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPiA9IHtcbiAgZGVidWc6IDAsXG4gIGluZm86IDEsXG4gIHdhcm46IDIsXG4gIGVycm9yOiAzLFxufTtcblxuLyoqXG4gKiBTaW1wbGUgbG9nZ2VyIGZvciBDb2RlVmliZSBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBsb2dGaWxlPzogc3RyaW5nO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcbiAgcHJpdmF0ZSBlbmFibGVDb25zb2xlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IExvZ2dlck9wdGlvbnMpIHtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdGhpcy5sb2dGaWxlID0gb3B0aW9ucy5sb2dGaWxlO1xuICAgIHRoaXMubGV2ZWwgPSBvcHRpb25zLmxldmVsIHx8ICdpbmZvJztcbiAgICB0aGlzLmVuYWJsZUNvbnNvbGUgPSBvcHRpb25zLmNvbnNvbGUgPz8gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5sb2dGaWxlKSB7XG4gICAgICB0aGlzLmVuc3VyZUxvZ0RpcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTG9nRGlyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvZ0ZpbGUpIHtcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0aGlzLmxvZ0ZpbGUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHtcbiAgICAgICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2cobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIExPR19MRVZFTFNbbGV2ZWxdID49IExPR19MRVZFTFNbdGhpcy5sZXZlbF07XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE1lc3NhZ2UobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCBsZXZlbFN0ciA9IGxldmVsLnRvVXBwZXJDYXNlKCkucGFkRW5kKDUpO1xuICAgIGxldCBtc2cgPSBgWyR7dGltZXN0YW1wfV0gWyR7bGV2ZWxTdHJ9XSBbJHt0aGlzLm5hbWV9XSAke21lc3NhZ2V9YDtcblxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbXNnICs9IGAgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXNnICs9IGAgJHtkYXRhfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1zZztcbiAgfVxuXG4gIHByaXZhdGUgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobGV2ZWwsIG1lc3NhZ2UsIGRhdGEpO1xuXG4gICAgaWYgKHRoaXMubG9nRmlsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmModGhpcy5sb2dGaWxlLCBmb3JtYXR0ZWQgKyAnXFxuJyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZ25vcmUgbG9nIHdyaXRlIGVycm9yc1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuYWJsZUNvbnNvbGUpIHtcbiAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgICAgY29uc29sZS53YXJuKGZvcm1hdHRlZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5sb2coZm9ybWF0dGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZGVidWcnLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2luZm8nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdlcnJvcicsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG5cbiAgc2V0TGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbG9nZ2VyIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihvcHRpb25zOiBMb2dnZXJPcHRpb25zKTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBzaGFyZWQgbG9nZ2VyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHtcbiAgbmFtZTogJ2NvZGV2aWJlLWNvcmUnLFxuICBsb2dGaWxlOiBwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjb2RldmliZS1jb3JlLmxvZycpLFxuICBsZXZlbDogJ2luZm8nLFxufSk7XG4iXX0=
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Shared prompt parser for interactive terminal prompts.
3
+ *
4
+ * Parses terminal snapshots (from tmux capture-pane) to extract
5
+ * interactive prompt options displayed by CLI tools (Gemini, Codex, etc.).
6
+ *
7
+ * Used by multiple plugins to dynamically capture options instead of hardcoding.
8
+ */
9
+ export type PromptKind = 'yes_no' | 'numbered' | 'text';
10
+ export interface InteractivePromptOption {
11
+ number: string;
12
+ text: string;
13
+ }
14
+ export interface ParsedInteractivePrompt {
15
+ kind: PromptKind;
16
+ promptText: string;
17
+ options: InteractivePromptOption[];
18
+ submitMap: Record<string, string>;
19
+ requiresFollowUpText?: boolean;
20
+ }
21
+ /**
22
+ * Parse a terminal snapshot to extract interactive prompt options.
23
+ *
24
+ * Detects two prompt types:
25
+ * - Yes/No prompts: [y/n] patterns
26
+ * - Numbered prompts: "1. Allow once", "2. Allow for this session", etc.
27
+ *
28
+ * Returns null if no prompt is detected.
29
+ */
30
+ export declare function parseInteractivePrompt(snapshot: string): ParsedInteractivePrompt | null;
31
+ /**
32
+ * Strip ANSI escape codes, box-drawing characters, and normalize whitespace
33
+ * from terminal output.
34
+ *
35
+ * Box-drawing characters (│, ┌, ┐, └, ┘, ─, etc.) are used by TUI apps like
36
+ * Gemini CLI to render bordered panels. Stripping them exposes the text content
37
+ * so the parser can match option lines inside boxes.
38
+ */
39
+ export declare function normalizeSnapshot(snapshot: string): string;
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Shared prompt parser for interactive terminal prompts.
4
+ *
5
+ * Parses terminal snapshots (from tmux capture-pane) to extract
6
+ * interactive prompt options displayed by CLI tools (Gemini, Codex, etc.).
7
+ *
8
+ * Used by multiple plugins to dynamically capture options instead of hardcoding.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.parseInteractivePrompt = parseInteractivePrompt;
12
+ exports.normalizeSnapshot = normalizeSnapshot;
13
+ const ANSI_PATTERN = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;
14
+ /**
15
+ * Parse a terminal snapshot to extract interactive prompt options.
16
+ *
17
+ * Detects two prompt types:
18
+ * - Yes/No prompts: [y/n] patterns
19
+ * - Numbered prompts: "1. Allow once", "2. Allow for this session", etc.
20
+ *
21
+ * Returns null if no prompt is detected.
22
+ */
23
+ function parseInteractivePrompt(snapshot) {
24
+ const normalized = normalizeSnapshot(snapshot);
25
+ if (!normalized) {
26
+ return null;
27
+ }
28
+ const yesNo = parseYesNoPrompt(normalized);
29
+ if (yesNo) {
30
+ return yesNo;
31
+ }
32
+ const numbered = parseNumberedPrompt(normalized);
33
+ if (numbered) {
34
+ return numbered;
35
+ }
36
+ return null;
37
+ }
38
+ /**
39
+ * Strip ANSI escape codes, box-drawing characters, and normalize whitespace
40
+ * from terminal output.
41
+ *
42
+ * Box-drawing characters (│, ┌, ┐, └, ┘, ─, etc.) are used by TUI apps like
43
+ * Gemini CLI to render bordered panels. Stripping them exposes the text content
44
+ * so the parser can match option lines inside boxes.
45
+ */
46
+ function normalizeSnapshot(snapshot) {
47
+ return snapshot
48
+ .replace(/\r/g, '\n')
49
+ .replace(ANSI_PATTERN, '')
50
+ .replace(/[│┌┐└┘─├┤┬┴┼╌╎╭╮╯╰║═╔╗╚╝╠╣╦╩╬]/g, ' ')
51
+ .replace(/[ \t]+\n/g, '\n')
52
+ .replace(/\n{3,}/g, '\n\n')
53
+ .trim();
54
+ }
55
+ function parseYesNoPrompt(snapshot) {
56
+ const lines = snapshot.split('\n').map(line => line.trim());
57
+ const promptLineIndex = findLastMatchingLineIndex(lines, line => /\[(?:y\/n|Y\/n|y\/N)\]/.test(line));
58
+ const promptLine = promptLineIndex >= 0 ? lines[promptLineIndex] : null;
59
+ if (!promptLine) {
60
+ return null;
61
+ }
62
+ const promptLines = extractPromptBlock(lines, promptLineIndex);
63
+ const promptText = promptLines.length > 0 ? promptLines.join('\n') : promptLine;
64
+ const lower = promptText.toLowerCase();
65
+ const requiresFollowUpText = lower.includes('what to change') ||
66
+ lower.includes('what should') ||
67
+ lower.includes('provide') ||
68
+ lower.includes('instructions');
69
+ const options = requiresFollowUpText
70
+ ? [
71
+ { number: '1', text: 'Yes' },
72
+ { number: '2', text: 'No, provide instructions' },
73
+ ]
74
+ : [
75
+ { number: '1', text: 'Yes' },
76
+ { number: '2', text: 'No' },
77
+ ];
78
+ const submitMap = {
79
+ '1': 'y',
80
+ '2': 'n',
81
+ };
82
+ return {
83
+ kind: 'yes_no',
84
+ promptText,
85
+ options,
86
+ submitMap,
87
+ requiresFollowUpText,
88
+ };
89
+ }
90
+ function parseNumberedPrompt(snapshot) {
91
+ const lines = snapshot.split('\n').map(line => line.trim());
92
+ const optionBlock = findTrailingOptionBlock(lines);
93
+ if (optionBlock.length < 2) {
94
+ return null;
95
+ }
96
+ const options = optionBlock
97
+ .map(({ line }) => parseOptionLine(line))
98
+ .filter((option) => !!option);
99
+ const submitMap = {};
100
+ for (const option of options) {
101
+ submitMap[option.number] = option.number;
102
+ }
103
+ const firstOptionIndex = optionBlock[0]?.index ?? -1;
104
+ const promptLines = extractPromptBlock(lines, firstOptionIndex - 1);
105
+ const promptText = promptLines.length > 0 ? promptLines.join('\n') : 'Select an option';
106
+ return {
107
+ kind: 'numbered',
108
+ promptText,
109
+ options,
110
+ submitMap,
111
+ };
112
+ }
113
+ function findLastMatchingLineIndex(lines, predicate) {
114
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
115
+ if (predicate(lines[index])) {
116
+ return index;
117
+ }
118
+ }
119
+ return -1;
120
+ }
121
+ function parseOptionLine(line) {
122
+ const match = line.match(/^(?:[>›❯▸▶➜➤*●]\s*)?(\d+)\.\s+(.*)$/);
123
+ if (!match) {
124
+ return null;
125
+ }
126
+ return {
127
+ number: match[1],
128
+ text: match[2],
129
+ };
130
+ }
131
+ function findTrailingOptionBlock(lines) {
132
+ const matches = lines
133
+ .map((line, index) => ({ index, line, parsed: parseOptionLine(line) }))
134
+ .filter((entry) => !!entry.parsed);
135
+ if (matches.length === 0) {
136
+ return [];
137
+ }
138
+ const block = [matches[matches.length - 1]];
139
+ for (let index = matches.length - 2; index >= 0; index -= 1) {
140
+ const current = matches[index];
141
+ const next = block[0];
142
+ if (current.index !== next.index - 1) {
143
+ break;
144
+ }
145
+ block.unshift(current);
146
+ }
147
+ return block.map(({ index, line }) => ({ index, line }));
148
+ }
149
+ function extractPromptBlock(lines, endIndex) {
150
+ if (endIndex < 0) {
151
+ return [];
152
+ }
153
+ let cursor = skipBlankLinesUp(lines, endIndex);
154
+ if (cursor < 0) {
155
+ return [];
156
+ }
157
+ const { start: mainBlockStart, end: blockEnd } = findNonEmptyBlockEndingAt(lines, cursor);
158
+ const mainBlock = lines.slice(mainBlockStart, blockEnd + 1).filter(Boolean);
159
+ if (isDiffPreviewBlock(mainBlock)) {
160
+ const recoveredPrompt = collectPromptBlocksAbove(lines, mainBlockStart - 1);
161
+ return recoveredPrompt.length > 0 ? recoveredPrompt : mainBlock;
162
+ }
163
+ if (mainBlockStart <= 1) {
164
+ return mainBlock;
165
+ }
166
+ let gapCursor = mainBlockStart - 1;
167
+ gapCursor = skipBlankLinesUp(lines, gapCursor);
168
+ if (gapCursor < 0 || gapCursor === mainBlockStart - 1) {
169
+ return mainBlock;
170
+ }
171
+ const { start: headingBlockStart, end: headingBlockEnd } = findNonEmptyBlockEndingAt(lines, gapCursor);
172
+ const headingBlock = lines.slice(headingBlockStart, headingBlockEnd + 1).filter(Boolean);
173
+ const headingMatched = headingBlock.some(isPromptHeadingLine);
174
+ if (!headingMatched) {
175
+ return mainBlock;
176
+ }
177
+ return [...headingBlock, ...mainBlock];
178
+ }
179
+ function isPromptHeadingLine(line) {
180
+ return /^(?:would you like to|do you want to|the model would like to|action required|confirm)\b/i.test(line);
181
+ }
182
+ function isLikelyFileSummaryLine(line) {
183
+ return /^.+\/[^/]+\s+\(\+\d+\s+-\d+\)$/.test(line);
184
+ }
185
+ function skipBlankLinesUp(lines, startIndex) {
186
+ let cursor = startIndex;
187
+ while (cursor >= 0 && !lines[cursor]) {
188
+ cursor -= 1;
189
+ }
190
+ return cursor;
191
+ }
192
+ function findNonEmptyBlockEndingAt(lines, endIndex) {
193
+ let cursor = endIndex;
194
+ while (cursor >= 0 && lines[cursor]) {
195
+ cursor -= 1;
196
+ }
197
+ return {
198
+ start: cursor + 1,
199
+ end: endIndex,
200
+ };
201
+ }
202
+ function collectPromptBlocksAbove(lines, startIndex) {
203
+ const blocks = [];
204
+ let cursor = startIndex;
205
+ while (cursor >= 0 && blocks.length < 2) {
206
+ cursor = skipBlankLinesUp(lines, cursor);
207
+ if (cursor < 0) {
208
+ break;
209
+ }
210
+ const { start, end } = findNonEmptyBlockEndingAt(lines, cursor);
211
+ const block = lines.slice(start, end + 1).filter(Boolean);
212
+ if (block.length > 0) {
213
+ blocks.unshift(block);
214
+ }
215
+ cursor = start - 1;
216
+ }
217
+ if (blocks.length === 0) {
218
+ return [];
219
+ }
220
+ const headingBlockIndex = blocks.findIndex(block => block.some(isPromptHeadingLine));
221
+ if (headingBlockIndex >= 0) {
222
+ return blocks.slice(headingBlockIndex).flat();
223
+ }
224
+ return blocks[blocks.length - 1];
225
+ }
226
+ function isDiffPreviewBlock(lines) {
227
+ if (lines.length === 0) {
228
+ return false;
229
+ }
230
+ const lineNumberedRows = lines.filter(isLineNumberedDiffLine).length;
231
+ return lineNumberedRows >= Math.max(2, Math.ceil(lines.length / 2));
232
+ }
233
+ function isLineNumberedDiffLine(line) {
234
+ return /^\d+\s/.test(line);
235
+ }
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9tcHQtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQTRCSCx3REFpQkM7QUFVRCw4Q0FRQztBQTlDRCxNQUFNLFlBQVksR0FBRyx3Q0FBd0MsQ0FBQztBQUU5RDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLFFBQWdCO0lBQ3JELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsUUFBZ0I7SUFDaEQsT0FBTyxRQUFRO1NBQ1osT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7U0FDcEIsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7U0FDekIsT0FBTyxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQztTQUMvQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztTQUMxQixPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztTQUMxQixJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCO0lBQ3hDLE1BQU0sS0FB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TUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsS0FBZTtJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JFLE9BQU8sZ0JBQWdCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsSUFBWTtJQUMxQyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHByb21wdCBwYXJzZXIgZm9yIGludGVyYWN0aXZlIHRlcm1pbmFsIHByb21wdHMuXG4gKlxuICogUGFyc2VzIHRlcm1pbmFsIHNuYXBzaG90cyAoZnJvbSB0bXV4IGNhcHR1cmUtcGFuZSkgdG8gZXh0cmFjdFxuICogaW50ZXJhY3RpdmUgcHJvbXB0IG9wdGlvbnMgZGlzcGxheWVkIGJ5IENMSSB0b29scyAoR2VtaW5pLCBDb2RleCwgZXRjLikuXG4gKlxuICogVXNlZCBieSBtdWx0aXBsZSBwbHVnaW5zIHRvIGR5bmFtaWNhbGx5IGNhcHR1cmUgb3B0aW9ucyBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcuXG4gKi9cblxuZXhwb3J0IHR5cGUgUHJvbXB0S2luZCA9ICd5ZXNfbm8nIHwgJ251bWJlcmVkJyB8ICd0ZXh0JztcblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGl2ZVByb21wdE9wdGlvbiB7XG4gIG51bWJlcjogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkSW50ZXJhY3RpdmVQcm9tcHQge1xuICBraW5kOiBQcm9tcHRLaW5kO1xuICBwcm9tcHRUZXh0OiBzdHJpbmc7XG4gIG9wdGlvbnM6IEludGVyYWN0aXZlUHJvbXB0T3B0aW9uW107XG4gIHN1Ym1pdE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVxdWlyZXNGb2xsb3dVcFRleHQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBBTlNJX1BBVFRFUk4gPSAvXFx4MUIoPzpbQC1aXFxcXC1fXXxcXFtbMC0/XSpbIC0vXSpbQC1+XSkvZztcblxuLyoqXG4gKiBQYXJzZSBhIHRlcm1pbmFsIHNuYXBzaG90IHRvIGV4dHJhY3QgaW50ZXJhY3RpdmUgcHJvbXB0IG9wdGlvbnMuXG4gKlxuICogRGV0ZWN0cyB0d28gcHJvbXB0IHR5cGVzOlxuICogLSBZZXMvTm8gcHJvbXB0czogW3kvbl0gcGF0dGVybnNcbiAqIC0gTnVtYmVyZWQgcHJvbXB0czogXCIxLiBBbGxvdyBvbmNlXCIsIFwiMi4gQWxsb3cgZm9yIHRoaXMgc2Vzc2lvblwiLCBldGMuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIG5vIHByb21wdCBpcyBkZXRlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50ZXJhY3RpdmVQcm9tcHQoc25hcHNob3Q6IHN0cmluZyk6IFBhcnNlZEludGVyYWN0aXZlUHJvbXB0IHwgbnVsbCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIGlmICghbm9ybWFsaXplZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeWVzTm8gPSBwYXJzZVllc05vUHJvbXB0KG5vcm1hbGl6ZWQpO1xuICBpZiAoeWVzTm8pIHtcbiAgICByZXR1cm4geWVzTm87XG4gIH1cblxuICBjb25zdCBudW1iZXJlZCA9IHBhcnNlTnVtYmVyZWRQcm9tcHQobm9ybWFsaXplZCk7XG4gIGlmIChudW1iZXJlZCkge1xuICAgIHJldHVybiBudW1iZXJlZDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFN0cmlwIEFOU0kgZXNjYXBlIGNvZGVzLCBib3gtZHJhd2luZyBjaGFyYWN0ZXJzLCBhbmQgbm9ybWFsaXplIHdoaXRlc3BhY2VcbiAqIGZyb20gdGVybWluYWwgb3V0cHV0LlxuICpcbiAqIEJveC1kcmF3aW5nIGNoYXJhY3RlcnMgKOKUgiwg4pSMLCDilJAsIOKUlCwg4pSYLCDilIAsIGV0Yy4pIGFyZSB1c2VkIGJ5IFRVSSBhcHBzIGxpa2VcbiAqIEdlbWluaSBDTEkgdG8gcmVuZGVyIGJvcmRlcmVkIHBhbmVscy4gU3RyaXBwaW5nIHRoZW0gZXhwb3NlcyB0aGUgdGV4dCBjb250ZW50XG4gKiBzbyB0aGUgcGFyc2VyIGNhbiBtYXRjaCBvcHRpb24gbGluZXMgaW5zaWRlIGJveGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU25hcHNob3Qoc25hcHNob3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzbmFwc2hvdFxuICAgIC5yZXBsYWNlKC9cXHIvZywgJ1xcbicpXG4gICAgLnJlcGxhY2UoQU5TSV9QQVRURVJOLCAnJylcbiAgICAucmVwbGFjZSgvW+KUguKUjOKUkOKUlOKUmOKUgOKUnOKUpOKUrOKUtOKUvOKVjOKVjuKVreKVruKVr+KVsOKVkeKVkOKVlOKVl+KVmuKVneKVoOKVo+KVpuKVqeKVrF0vZywgJyAnKVxuICAgIC5yZXBsYWNlKC9bIFxcdF0rXFxuL2csICdcXG4nKVxuICAgIC5yZXBsYWNlKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVzTm9Qcm9tcHQoc25hcHNob3Q6IHN0cmluZyk6IFBhcnNlZEludGVyYWN0aXZlUHJvbXB0IHwgbnVsbCB7XG4gIGNvbnN0IGxpbmVzID0gc25hcHNob3Quc3BsaXQoJ1xcbicpLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKTtcbiAgY29uc3QgcHJvbXB0TGluZUluZGV4ID0gZmluZExhc3RNYXRjaGluZ0xpbmVJbmRleChsaW5lcywgbGluZSA9PiAvXFxbKD86eVxcL258WVxcL258eVxcL04pXFxdLy50ZXN0KGxpbmUpKTtcbiAgY29uc3QgcHJvbXB0TGluZSA9IHByb21wdExpbmVJbmRleCA+PSAwID8gbGluZXNbcHJvbXB0TGluZUluZGV4XSA6IG51bGw7XG5cbiAgaWYgKCFwcm9tcHRMaW5lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwcm9tcHRMaW5lcyA9IGV4dHJhY3RQcm9tcHRCbG9jayhsaW5lcywgcHJvbXB0TGluZUluZGV4KTtcbiAgY29uc3QgcHJvbXB0VGV4dCA9IHByb21wdExpbmVzLmxlbmd0aCA+IDAgPyBwcm9tcHRMaW5lcy5qb2luKCdcXG4nKSA6IHByb21wdExpbmU7XG5cbiAgY29uc3QgbG93ZXIgPSBwcm9tcHRUZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJlcXVpcmVzRm9sbG93VXBUZXh0ID1cbiAgICBsb3dlci5pbmNsdWRlcygnd2hhdCB0byBjaGFuZ2UnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd3aGF0IHNob3VsZCcpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3Byb3ZpZGUnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCdpbnN0cnVjdGlvbnMnKTtcblxuICBjb25zdCBvcHRpb25zOiBJbnRlcmFjdGl2ZVByb21wdE9wdGlvbltdID0gcmVxdWlyZXNGb2xsb3dVcFRleHRcbiAgICA/IFtcbiAgICAgICAgeyBudW1iZXI6ICcxJywgdGV4dDogJ1llcycgfSxcbiAgICAgICAgeyBudW1iZXI6ICcyJywgdGV4dDogJ05vLCBwcm92aWRlIGluc3RydWN0aW9ucycgfSxcbiAgICAgIF1cbiAgICA6IFtcbiAgICAgICAgeyBudW1iZXI6ICcxJywgdGV4dDogJ1llcycgfSxcbiAgICAgICAgeyBudW1iZXI6ICcyJywgdGV4dDogJ05vJyB9LFxuICAgICAgXTtcblxuICBjb25zdCBzdWJtaXRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJzEnOiAneScsXG4gICAgJzInOiAnbicsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBraW5kOiAneWVzX25vJyxcbiAgICBwcm9tcHRUZXh0LFxuICAgIG9wdGlvbnMsXG4gICAgc3VibWl0TWFwLFxuICAgIHJlcXVpcmVzRm9sbG93VXBUZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU51bWJlcmVkUHJvbXB0KHNuYXBzaG90OiBzdHJpbmcpOiBQYXJzZWRJbnRlcmFjdGl2ZVByb21wdCB8IG51bGwge1xuICBjb25zdCBsaW5lcyA9IHNuYXBzaG90LnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSk7XG5cbiAgY29uc3Qgb3B0aW9uQmxvY2sgPSBmaW5kVHJhaWxpbmdPcHRpb25CbG9jayhsaW5lcyk7XG4gIGlmIChvcHRpb25CbG9jay5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uQmxvY2tcbiAgICAubWFwKCh7IGxpbmUgfSkgPT4gcGFyc2VPcHRpb25MaW5lKGxpbmUpKVxuICAgIC5maWx0ZXIoKG9wdGlvbik6IG9wdGlvbiBpcyBJbnRlcmFjdGl2ZVByb21wdE9wdGlvbiA9PiAhIW9wdGlvbik7XG5cbiAgY29uc3Qgc3VibWl0TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICBzdWJtaXRNYXBbb3B0aW9uLm51bWJlcl0gPSBvcHRpb24ubnVtYmVyO1xuICB9XG5cbiAgY29uc3QgZmlyc3RPcHRpb25JbmRleCA9IG9wdGlvbkJsb2NrWzBdPy5pbmRleCA/PyAtMTtcbiAgY29uc3QgcHJvbXB0TGluZXMgPSBleHRyYWN0UHJvbXB0QmxvY2sobGluZXMsIGZpcnN0T3B0aW9uSW5kZXggLSAxKTtcbiAgY29uc3QgcHJvbXB0VGV4dCA9IHByb21wdExpbmVzLmxlbmd0aCA+IDAgPyBwcm9tcHRMaW5lcy5qb2luKCdcXG4nKSA6ICdTZWxlY3QgYW4gb3B0aW9uJztcblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdudW1iZXJlZCcsXG4gICAgcHJvbXB0VGV4dCxcbiAgICBvcHRpb25zLFxuICAgIHN1Ym1pdE1hcCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZExhc3RNYXRjaGluZ0xpbmVJbmRleChsaW5lczogc3RyaW5nW10sIHByZWRpY2F0ZTogKGxpbmU6IHN0cmluZykgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gIGZvciAobGV0IGluZGV4ID0gbGluZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgIGlmIChwcmVkaWNhdGUobGluZXNbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9uTGluZShsaW5lOiBzdHJpbmcpOiBJbnRlcmFjdGl2ZVByb21wdE9wdGlvbiB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oPzpbPuKAuuKdr+KWuOKWtuKenOKepCril49dXFxzKik/KFxcZCspXFwuXFxzKyguKikkLyk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIG51bWJlcjogbWF0Y2hbMV0sXG4gICAgdGV4dDogbWF0Y2hbMl0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRUcmFpbGluZ09wdGlvbkJsb2NrKGxpbmVzOiBzdHJpbmdbXSk6IEFycmF5PHsgaW5kZXg6IG51bWJlcjsgbGluZTogc3RyaW5nIH0+IHtcbiAgY29uc3QgbWF0Y2hlcyA9IGxpbmVzXG4gICAgLm1hcCgobGluZSwgaW5kZXgpID0+ICh7IGluZGV4LCBsaW5lLCBwYXJzZWQ6IHBhcnNlT3B0aW9uTGluZShsaW5lKSB9KSlcbiAgICAuZmlsdGVyKChlbnRyeSkgPT4gISFlbnRyeS5wYXJzZWQpO1xuXG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrOiBBcnJheTx7IGluZGV4OiBudW1iZXI7IGxpbmU6IHN0cmluZyB9PiA9IFttYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV1dO1xuXG4gIGZvciAobGV0IGluZGV4ID0gbWF0Y2hlcy5sZW5ndGggLSAyOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgY29uc3QgY3VycmVudCA9IG1hdGNoZXNbaW5kZXhdO1xuICAgIGNvbnN0IG5leHQgPSBibG9ja1swXTtcbiAgICBpZiAoY3VycmVudC5pbmRleCAhPT0gbmV4dC5pbmRleCAtIDEpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBibG9jay51bnNoaWZ0KGN1cnJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIGJsb2NrLm1hcCgoeyBpbmRleCwgbGluZSB9KSA9PiAoeyBpbmRleCwgbGluZSB9KSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9tcHRCbG9jayhsaW5lczogc3RyaW5nW10sIGVuZEluZGV4OiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIGlmIChlbmRJbmRleCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsZXQgY3Vyc29yID0gc2tpcEJsYW5rTGluZXNVcChsaW5lcywgZW5kSW5kZXgpO1xuICBpZiAoY3Vyc29yIDwgMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhcnQ6IG1haW5CbG9ja1N0YXJ0LCBlbmQ6IGJsb2NrRW5kIH0gPSBmaW5kTm9uRW1wdHlCbG9ja0VuZGluZ0F0KGxpbmVzLCBjdXJzb3IpO1xuICBjb25zdCBtYWluQmxvY2sgPSBsaW5lcy5zbGljZShtYWluQmxvY2tTdGFydCwgYmxvY2tFbmQgKyAxKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgaWYgKGlzRGlmZlByZXZpZXdCbG9jayhtYWluQmxvY2spKSB7XG4gICAgY29uc3QgcmVjb3ZlcmVkUHJvbXB0ID0gY29sbGVjdFByb21wdEJsb2Nrc0Fib3ZlKGxpbmVzLCBtYWluQmxvY2tTdGFydCAtIDEpO1xuICAgIHJldHVybiByZWNvdmVyZWRQcm9tcHQubGVuZ3RoID4gMCA/IHJlY292ZXJlZFByb21wdCA6IG1haW5CbG9jaztcbiAgfVxuXG4gIGlmIChtYWluQmxvY2tTdGFydCA8PSAxKSB7XG4gICAgcmV0dXJuIG1haW5CbG9jaztcbiAgfVxuXG4gIGxldCBnYXBDdXJzb3IgPSBtYWluQmxvY2tTdGFydCAtIDE7XG4gIGdhcEN1cnNvciA9IHNraXBCbGFua0xpbmVzVXAobGluZXMsIGdhcEN1cnNvcik7XG5cbiAgaWYgKGdhcEN1cnNvciA8IDAgfHwgZ2FwQ3Vyc29yID09PSBtYWluQmxvY2tTdGFydCAtIDEpIHtcbiAgICByZXR1cm4gbWFpbkJsb2NrO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydDogaGVhZGluZ0Jsb2NrU3RhcnQsIGVuZDogaGVhZGluZ0Jsb2NrRW5kIH0gPSBmaW5kTm9uRW1wdHlCbG9ja0VuZGluZ0F0KGxpbmVzLCBnYXBDdXJzb3IpO1xuICBjb25zdCBoZWFkaW5nQmxvY2sgPSBsaW5lcy5zbGljZShoZWFkaW5nQmxvY2tTdGFydCwgaGVhZGluZ0Jsb2NrRW5kICsgMSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBoZWFkaW5nTWF0Y2hlZCA9IGhlYWRpbmdCbG9jay5zb21lKGlzUHJvbXB0SGVhZGluZ0xpbmUpO1xuXG4gIGlmICghaGVhZGluZ01hdGNoZWQpIHtcbiAgICByZXR1cm4gbWFpbkJsb2NrO1xuICB9XG5cbiAgcmV0dXJuIFsuLi5oZWFkaW5nQmxvY2ssIC4uLm1haW5CbG9ja107XG59XG5cbmZ1bmN0aW9uIGlzUHJvbXB0SGVhZGluZ0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXig/OndvdWxkIHlvdSBsaWtlIHRvfGRvIHlvdSB3YW50IHRvfHRoZSBtb2RlbCB3b3VsZCBsaWtlIHRvfGFjdGlvbiByZXF1aXJlZHxjb25maXJtKVxcYi9pLnRlc3QobGluZSk7XG59XG5cbmZ1bmN0aW9uIGlzTGlrZWx5RmlsZVN1bW1hcnlMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14uK1xcL1teL10rXFxzK1xcKFxcK1xcZCtcXHMrLVxcZCtcXCkkLy50ZXN0KGxpbmUpO1xufVxuXG5mdW5jdGlvbiBza2lwQmxhbmtMaW5lc1VwKGxpbmVzOiBzdHJpbmdbXSwgc3RhcnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGN1cnNvciA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChjdXJzb3IgPj0gMCAmJiAhbGluZXNbY3Vyc29yXSkge1xuICAgIGN1cnNvciAtPSAxO1xuICB9XG4gIHJldHVybiBjdXJzb3I7XG59XG5cbmZ1bmN0aW9uIGZpbmROb25FbXB0eUJsb2NrRW5kaW5nQXQobGluZXM6IHN0cmluZ1tdLCBlbmRJbmRleDogbnVtYmVyKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgbGV0IGN1cnNvciA9IGVuZEluZGV4O1xuICB3aGlsZSAoY3Vyc29yID49IDAgJiYgbGluZXNbY3Vyc29yXSkge1xuICAgIGN1cnNvciAtPSAxO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGN1cnNvciArIDEsXG4gICAgZW5kOiBlbmRJbmRleCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFByb21wdEJsb2Nrc0Fib3ZlKGxpbmVzOiBzdHJpbmdbXSwgc3RhcnRJbmRleDogbnVtYmVyKTogc3RyaW5nW10ge1xuICBjb25zdCBibG9ja3M6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IGN1cnNvciA9IHN0YXJ0SW5kZXg7XG5cbiAgd2hpbGUgKGN1cnNvciA+PSAwICYmIGJsb2Nrcy5sZW5ndGggPCAyKSB7XG4gICAgY3Vyc29yID0gc2tpcEJsYW5rTGluZXNVcChsaW5lcywgY3Vyc29yKTtcbiAgICBpZiAoY3Vyc29yIDwgMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBmaW5kTm9uRW1wdHlCbG9ja0VuZGluZ0F0KGxpbmVzLCBjdXJzb3IpO1xuICAgIGNvbnN0IGJsb2NrID0gbGluZXMuc2xpY2Uoc3RhcnQsIGVuZCArIDEpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoYmxvY2subGVuZ3RoID4gMCkge1xuICAgICAgYmxvY2tzLnVuc2hpZnQoYmxvY2spO1xuICAgIH1cblxuICAgIGN1cnNvciA9IHN0YXJ0IC0gMTtcbiAgfVxuXG4gIGlmIChibG9ja3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgaGVhZGluZ0Jsb2NrSW5kZXggPSBibG9ja3MuZmluZEluZGV4KGJsb2NrID0+IGJsb2NrLnNvbWUoaXNQcm9tcHRIZWFkaW5nTGluZSkpO1xuICBpZiAoaGVhZGluZ0Jsb2NrSW5kZXggPj0gMCkge1xuICAgIHJldHVybiBibG9ja3Muc2xpY2UoaGVhZGluZ0Jsb2NrSW5kZXgpLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBibG9ja3NbYmxvY2tzLmxlbmd0aCAtIDFdO1xufVxuXG5mdW5jdGlvbiBpc0RpZmZQcmV2aWV3QmxvY2sobGluZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbGluZU51bWJlcmVkUm93cyA9IGxpbmVzLmZpbHRlcihpc0xpbmVOdW1iZXJlZERpZmZMaW5lKS5sZW5ndGg7XG4gIHJldHVybiBsaW5lTnVtYmVyZWRSb3dzID49IE1hdGgubWF4KDIsIE1hdGguY2VpbChsaW5lcy5sZW5ndGggLyAyKSk7XG59XG5cbmZ1bmN0aW9uIGlzTGluZU51bWJlcmVkRGlmZkxpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxcZCtcXHMvLnRlc3QobGluZSk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { resumeOrCreateSession, prepareSessionEncryption } from './session-resume';
2
+ export type { ResumeOrCreateSessionInput, ResumeOrCreateSessionResult } from './session-resume';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareSessionEncryption = exports.resumeOrCreateSession = void 0;
4
+ var session_resume_1 = require("./session-resume");
5
+ Object.defineProperty(exports, "resumeOrCreateSession", { enumerable: true, get: function () { return session_resume_1.resumeOrCreateSession; } });
6
+ Object.defineProperty(exports, "prepareSessionEncryption", { enumerable: true, get: function () { return session_resume_1.prepareSessionEncryption; } });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2Vzc2lvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBbUY7QUFBMUUsdUhBQUEscUJBQXFCLE9BQUE7QUFBRSwwSEFBQSx3QkFBd0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHJlc3VtZU9yQ3JlYXRlU2Vzc2lvbiwgcHJlcGFyZVNlc3Npb25FbmNyeXB0aW9uIH0gZnJvbSAnLi9zZXNzaW9uLXJlc3VtZSc7XG5leHBvcnQgdHlwZSB7IFJlc3VtZU9yQ3JlYXRlU2Vzc2lvbklucHV0LCBSZXN1bWVPckNyZWF0ZVNlc3Npb25SZXN1bHQgfSBmcm9tICcuL3Nlc3Npb24tcmVzdW1lJztcbiJdfQ==
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Centralized session resume/create logic for all CodeVibe plugins.
3
+ *
4
+ * All three plugins (Claude, Codex, Gemini) need the same pattern:
5
+ * 1. Check if session exists in backend (getSession)
6
+ * 2. If exists: reactivate + restore E2E session key from encryptedKeys
7
+ * 3. If not exists: generate encryption keys + create session
8
+ *
9
+ * This module eliminates the duplication across plugins.
10
+ */
11
+ import { AppSyncClient } from '../appsync';
12
+ import { Logger } from '../logger';
13
+ import { AgentType, EncryptedSessionKey } from '../types';
14
+ export interface ResumeOrCreateSessionInput {
15
+ sessionId: string;
16
+ userId: string;
17
+ agentType: AgentType;
18
+ projectPath: string;
19
+ metadata?: Record<string, any>;
20
+ }
21
+ export interface ResumeOrCreateSessionResult {
22
+ /** Whether an existing session was found and reactivated */
23
+ resumed: boolean;
24
+ /** The E2E session key (for encrypting/decrypting events), or null if no encryption */
25
+ sessionKey: string | null;
26
+ }
27
+ /**
28
+ * Prepare E2E encryption for a new session.
29
+ *
30
+ * Generates a random session key and encrypts it for all registered devices.
31
+ * Does NOT cache the session key — callers should cache only after the session
32
+ * is successfully created in the backend.
33
+ *
34
+ * @returns Encryption data or null if no device keys found / error
35
+ */
36
+ export declare function prepareSessionEncryption(sessionId: string, appSyncClient: AppSyncClient, logger: Logger): Promise<{
37
+ sessionKey: string;
38
+ encryptedKeys: EncryptedSessionKey[];
39
+ } | null>;
40
+ /**
41
+ * Resume an existing session or create a new one.
42
+ *
43
+ * Resume path (session exists in backend):
44
+ * - Reactivates session (status → ACTIVE)
45
+ * - Restores E2E session key from encryptedKeys
46
+ *
47
+ * Create path (session does not exist):
48
+ * - Prepares E2E encryption (generates key, encrypts for all devices)
49
+ * - Encrypts projectPath and metadata
50
+ * - Creates session in backend
51
+ * - Caches session key only after successful creation
52
+ *
53
+ * @throws Propagates createSession errors (e.g., SESSION_LIMIT_EXCEEDED)
54
+ */
55
+ export declare function resumeOrCreateSession(input: ResumeOrCreateSessionInput, appSyncClient: AppSyncClient, logger: Logger): Promise<ResumeOrCreateSessionResult>;