@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.
- package/README.md +178 -0
- package/bin/codevibe.js +7 -0
- package/dist/appsync/appsync-client.d.ts +132 -0
- package/dist/appsync/appsync-client.js +568 -0
- package/dist/appsync/index.d.ts +2 -0
- package/dist/appsync/index.js +10 -0
- package/dist/appsync/queries.d.ts +16 -0
- package/dist/appsync/queries.js +189 -0
- package/dist/auth/auth-cli.d.ts +5 -0
- package/dist/auth/auth-cli.js +217 -0
- package/dist/auth/auth-service.d.ts +53 -0
- package/dist/auth/auth-service.js +310 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.js +9 -0
- package/dist/config/config.d.ts +53 -0
- package/dist/config/config.js +123 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +8 -0
- package/dist/crypto/crypto-service.d.ts +118 -0
- package/dist/crypto/crypto-service.js +284 -0
- package/dist/crypto/index.d.ts +1 -0
- package/dist/crypto/index.js +9 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +68 -0
- package/dist/keychain/index.d.ts +1 -0
- package/dist/keychain/index.js +8 -0
- package/dist/keychain/keychain-manager.d.ts +125 -0
- package/dist/keychain/keychain-manager.js +375 -0
- package/dist/logger/index.d.ts +1 -0
- package/dist/logger/index.js +8 -0
- package/dist/logger/logger.d.ts +35 -0
- package/dist/logger/logger.js +142 -0
- package/dist/prompt-parser.d.ts +39 -0
- package/dist/prompt-parser.js +236 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.js +7 -0
- package/dist/session/session-resume.d.ts +55 -0
- package/dist/session/session-resume.js +151 -0
- package/dist/types/auth.d.ts +15 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/encryption.d.ts +54 -0
- package/dist/types/encryption.js +3 -0
- package/dist/types/events.d.ts +74 -0
- package/dist/types/events.js +28 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +22 -0
- package/dist/types/session.d.ts +59 -0
- package/dist/types/session.js +22 -0
- 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,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>;
|