workplace-pua-cli 0.4.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/.env.example +4 -0
- package/.eslintrc.json +21 -0
- package/.prettierrc.json +9 -0
- package/CHANGELOG.md +107 -0
- package/README.md +240 -0
- package/bin/pua +2 -0
- package/dist/commands/chat.d.ts +15 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +262 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +247 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/prompt.d.ts +14 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +126 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config/providers.d.ts +37 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +96 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/session-storage.d.ts +29 -0
- package/dist/config/session-storage.d.ts.map +1 -0
- package/dist/config/session-storage.js +67 -0
- package/dist/config/session-storage.js.map +1 -0
- package/dist/config/settings.d.ts +55 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +163 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/storage.d.ts +69 -0
- package/dist/config/storage.d.ts.map +1 -0
- package/dist/config/storage.js +126 -0
- package/dist/config/storage.js.map +1 -0
- package/dist/history/session.d.ts +52 -0
- package/dist/history/session.d.ts.map +1 -0
- package/dist/history/session.js +122 -0
- package/dist/history/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base.d.ts +38 -0
- package/dist/llm/base.d.ts.map +1 -0
- package/dist/llm/base.js +22 -0
- package/dist/llm/base.js.map +1 -0
- package/dist/llm/factory.d.ts +12 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +26 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai.d.ts +10 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +97 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/zhipu.d.ts +10 -0
- package/dist/llm/zhipu.d.ts.map +1 -0
- package/dist/llm/zhipu.js +91 -0
- package/dist/llm/zhipu.js.map +1 -0
- package/dist/prompts/boss.d.ts +6 -0
- package/dist/prompts/boss.d.ts.map +1 -0
- package/dist/prompts/boss.js +41 -0
- package/dist/prompts/boss.js.map +1 -0
- package/dist/prompts/employee.d.ts +6 -0
- package/dist/prompts/employee.d.ts.map +1 -0
- package/dist/prompts/employee.js +41 -0
- package/dist/prompts/employee.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +9 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/utils/formatter.d.ts +25 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +83 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/stream.d.ts +36 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +74 -0
- package/dist/utils/stream.js.map +1 -0
- package/docs/OPTIMIZATION.md +772 -0
- package/docs/TECHNICAL_PRINCIPLES.md +663 -0
- package/package.json +52 -0
- package/sample/1.png +0 -0
- package/sample/2.png +0 -0
- package/screenshots/chat-dialogue.png +0 -0
- package/screenshots/chat-mode.png +0 -0
- package/src/__tests__/config/settings.test.ts +48 -0
- package/src/__tests__/prompts/boss.test.ts +35 -0
- package/src/commands/chat.ts +328 -0
- package/src/commands/config.ts +283 -0
- package/src/commands/prompt.ts +154 -0
- package/src/config/providers.ts +109 -0
- package/src/config/session-storage.ts +94 -0
- package/src/config/settings.ts +194 -0
- package/src/config/storage.ts +150 -0
- package/src/history/session.ts +141 -0
- package/src/index.ts +164 -0
- package/src/llm/base.ts +55 -0
- package/src/llm/factory.ts +24 -0
- package/src/llm/openai.ts +113 -0
- package/src/llm/zhipu.ts +101 -0
- package/src/prompts/boss.ts +43 -0
- package/src/prompts/employee.ts +43 -0
- package/src/prompts/index.ts +3 -0
- package/src/utils/formatter.ts +104 -0
- package/src/utils/logger.ts +31 -0
- package/src/utils/stream.ts +76 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SessionStorage = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
class SessionStorage {
|
|
11
|
+
sessionsDir;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.sessionsDir = path_1.default.join(os_1.default.homedir(), '.pua-cli', 'sessions');
|
|
14
|
+
this.ensureDirectory();
|
|
15
|
+
}
|
|
16
|
+
ensureDirectory() {
|
|
17
|
+
if (!fs_1.default.existsSync(this.sessionsDir)) {
|
|
18
|
+
fs_1.default.mkdirSync(this.sessionsDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
listSessions() {
|
|
22
|
+
const files = fs_1.default.readdirSync(this.sessionsDir)
|
|
23
|
+
.filter(f => f.endsWith('.json'));
|
|
24
|
+
return files.map(file => {
|
|
25
|
+
const filePath = path_1.default.join(this.sessionsDir, file);
|
|
26
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
27
|
+
return JSON.parse(content);
|
|
28
|
+
})
|
|
29
|
+
.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
30
|
+
}
|
|
31
|
+
loadSession(sessionId) {
|
|
32
|
+
const filePath = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
|
|
33
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
37
|
+
return JSON.parse(content);
|
|
38
|
+
}
|
|
39
|
+
saveSession(sessionData) {
|
|
40
|
+
const sessionId = this.generateId();
|
|
41
|
+
const now = new Date().toISOString();
|
|
42
|
+
const fullSession = {
|
|
43
|
+
...sessionData,
|
|
44
|
+
id: sessionId,
|
|
45
|
+
createdAt: now,
|
|
46
|
+
updatedAt: now
|
|
47
|
+
};
|
|
48
|
+
const filePath = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
|
|
49
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify(fullSession, null, 2));
|
|
50
|
+
return fullSession;
|
|
51
|
+
}
|
|
52
|
+
deleteSession(sessionId) {
|
|
53
|
+
const filePath = path_1.default.join(this.sessionsDir, `${sessionId}.json`);
|
|
54
|
+
if (fs_1.default.existsSync(filePath)) {
|
|
55
|
+
fs_1.default.unlinkSync(filePath);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
generateId() {
|
|
61
|
+
return `session-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
|
|
62
|
+
}
|
|
63
|
+
getSessionsDir() {
|
|
64
|
+
return this.sessionsDir;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.SessionStorage = SessionStorage;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-storage.js","sourceRoot":"","sources":["../../src/config/session-storage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AAiBpB,MAAM,OAAO,cAAc;IACjB,WAAW,CAAS;IAE5B;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACnE,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;QAElE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,WAAwB;QAClC,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,WAAW,GAAgB;YAC/B,GAAG,WAAW;YACd,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,GAAG;YACvC,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;QAClE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;QAElE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU;QAChB,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ProviderType } from './providers';
|
|
2
|
+
export interface RuntimeConfig {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
provider: ProviderType;
|
|
5
|
+
model: string;
|
|
6
|
+
role: 'boss' | 'employee';
|
|
7
|
+
severity: 'mild' | 'medium' | 'extreme';
|
|
8
|
+
}
|
|
9
|
+
export declare const DEFAULTS: {
|
|
10
|
+
provider: ProviderType;
|
|
11
|
+
model: string;
|
|
12
|
+
role: "boss" | "employee";
|
|
13
|
+
severity: "mild" | "medium" | "extreme";
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Load configuration with priority:
|
|
17
|
+
* 1. Command line options (highest)
|
|
18
|
+
* 2. Environment variables
|
|
19
|
+
* 3. Project config (.pua.json)
|
|
20
|
+
* 4. Global config (~/.config/pua-cli/config.json)
|
|
21
|
+
* 5. Defaults (lowest)
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadConfig(options?: {
|
|
24
|
+
provider?: ProviderType;
|
|
25
|
+
model?: string;
|
|
26
|
+
role?: 'boss' | 'employee';
|
|
27
|
+
severity?: 'mild' | 'medium' | 'extreme';
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
}): RuntimeConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown when API key is missing
|
|
32
|
+
*/
|
|
33
|
+
export declare class MissingApiKeyError extends Error {
|
|
34
|
+
constructor(provider: ProviderType);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if user needs onboarding
|
|
38
|
+
*/
|
|
39
|
+
export declare function needsOnboarding(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get provider's base URL
|
|
42
|
+
*/
|
|
43
|
+
export declare function getProviderBaseUrl(provider: ProviderType): string;
|
|
44
|
+
/**
|
|
45
|
+
* Get available models for a provider
|
|
46
|
+
*/
|
|
47
|
+
export declare function getProviderModels(provider: ProviderType): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Validate a config object
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateConfig(config: RuntimeConfig): {
|
|
52
|
+
valid: boolean;
|
|
53
|
+
errors: string[];
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAWA,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAK/F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED,eAAO,MAAM,QAAQ;cACE,YAAY;;UAEjB,MAAM,GAAG,UAAU;cACb,MAAM,GAAG,QAAQ,GAAG,SAAS;CACpD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE;IACnC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CA0DhB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,YAAY;CAanC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAUjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAUlE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA6B1F"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MissingApiKeyError = exports.DEFAULTS = void 0;
|
|
7
|
+
exports.loadConfig = loadConfig;
|
|
8
|
+
exports.needsOnboarding = needsOnboarding;
|
|
9
|
+
exports.getProviderBaseUrl = getProviderBaseUrl;
|
|
10
|
+
exports.getProviderModels = getProviderModels;
|
|
11
|
+
exports.validateConfig = validateConfig;
|
|
12
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
13
|
+
const storage_1 = require("./storage");
|
|
14
|
+
const providers_1 = require("./providers");
|
|
15
|
+
// Load environment variables
|
|
16
|
+
dotenv_1.default.config();
|
|
17
|
+
exports.DEFAULTS = {
|
|
18
|
+
provider: 'zhipu',
|
|
19
|
+
model: 'glm-4.7',
|
|
20
|
+
role: 'boss',
|
|
21
|
+
severity: 'medium',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Load configuration with priority:
|
|
25
|
+
* 1. Command line options (highest)
|
|
26
|
+
* 2. Environment variables
|
|
27
|
+
* 3. Project config (.pua.json)
|
|
28
|
+
* 4. Global config (~/.config/pua-cli/config.json)
|
|
29
|
+
* 5. Defaults (lowest)
|
|
30
|
+
*/
|
|
31
|
+
function loadConfig(options) {
|
|
32
|
+
// Start with defaults
|
|
33
|
+
let provider = exports.DEFAULTS.provider;
|
|
34
|
+
let model = exports.DEFAULTS.model;
|
|
35
|
+
let role = exports.DEFAULTS.role;
|
|
36
|
+
let severity = exports.DEFAULTS.severity;
|
|
37
|
+
let apiKey = '';
|
|
38
|
+
// Load global config
|
|
39
|
+
const globalConfig = (0, storage_1.loadGlobalConfig)();
|
|
40
|
+
// Load project config
|
|
41
|
+
const projectConfig = (0, storage_1.loadProjectConfig)();
|
|
42
|
+
// Apply global config
|
|
43
|
+
if (globalConfig) {
|
|
44
|
+
provider = globalConfig.defaults.provider || provider;
|
|
45
|
+
model = globalConfig.defaults.model || model;
|
|
46
|
+
role = globalConfig.defaults.role || role;
|
|
47
|
+
severity = globalConfig.defaults.severity || severity;
|
|
48
|
+
apiKey = globalConfig.providers[globalConfig.currentProvider]?.apiKey || '';
|
|
49
|
+
}
|
|
50
|
+
// Apply project config
|
|
51
|
+
if (projectConfig) {
|
|
52
|
+
if (projectConfig.provider)
|
|
53
|
+
provider = projectConfig.provider;
|
|
54
|
+
if (projectConfig.model)
|
|
55
|
+
model = projectConfig.model;
|
|
56
|
+
if (projectConfig.role)
|
|
57
|
+
role = projectConfig.role;
|
|
58
|
+
if (projectConfig.severity)
|
|
59
|
+
severity = projectConfig.severity;
|
|
60
|
+
}
|
|
61
|
+
// Apply environment variables
|
|
62
|
+
const envApiKey = (0, providers_1.getApiKeyFromEnv)(provider);
|
|
63
|
+
if (envApiKey) {
|
|
64
|
+
apiKey = envApiKey;
|
|
65
|
+
}
|
|
66
|
+
// Apply command line options (highest priority)
|
|
67
|
+
if (options) {
|
|
68
|
+
if (options.provider)
|
|
69
|
+
provider = options.provider;
|
|
70
|
+
if (options.model)
|
|
71
|
+
model = options.model;
|
|
72
|
+
if (options.role)
|
|
73
|
+
role = options.role;
|
|
74
|
+
if (options.severity)
|
|
75
|
+
severity = options.severity;
|
|
76
|
+
if (options.apiKey)
|
|
77
|
+
apiKey = options.apiKey;
|
|
78
|
+
}
|
|
79
|
+
// Ensure API key is available
|
|
80
|
+
if (!apiKey) {
|
|
81
|
+
throw new MissingApiKeyError(provider);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
apiKey,
|
|
85
|
+
provider,
|
|
86
|
+
model,
|
|
87
|
+
role,
|
|
88
|
+
severity,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Error thrown when API key is missing
|
|
93
|
+
*/
|
|
94
|
+
class MissingApiKeyError extends Error {
|
|
95
|
+
constructor(provider) {
|
|
96
|
+
const providerDef = (0, providers_1.getProvider)(provider);
|
|
97
|
+
const envKey = providerDef?.envKeyNames[0] || 'API_KEY';
|
|
98
|
+
super(`未找到 ${providerDef?.name || provider} 的 API Key\n\n` +
|
|
99
|
+
`请使用以下方式之一配置:\n` +
|
|
100
|
+
` 1. 运行: pua config\n` +
|
|
101
|
+
` 2. 设置环境变量: export ${envKey}="your-api-key"\n` +
|
|
102
|
+
` 3. 创建 .env 文件并添加: ${envKey}=your-api-key`);
|
|
103
|
+
this.name = 'MissingApiKeyError';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.MissingApiKeyError = MissingApiKeyError;
|
|
107
|
+
/**
|
|
108
|
+
* Check if user needs onboarding
|
|
109
|
+
*/
|
|
110
|
+
function needsOnboarding() {
|
|
111
|
+
return !(0, storage_1.hasGlobalConfig)();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get provider's base URL
|
|
115
|
+
*/
|
|
116
|
+
function getProviderBaseUrl(provider) {
|
|
117
|
+
const globalConfig = (0, storage_1.loadGlobalConfig)();
|
|
118
|
+
const providerConfig = globalConfig?.providers[provider];
|
|
119
|
+
if (providerConfig?.baseUrl) {
|
|
120
|
+
return providerConfig.baseUrl;
|
|
121
|
+
}
|
|
122
|
+
const providerDef = (0, providers_1.getProvider)(provider);
|
|
123
|
+
return providerDef?.defaultBaseUrl || '';
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get available models for a provider
|
|
127
|
+
*/
|
|
128
|
+
function getProviderModels(provider) {
|
|
129
|
+
const globalConfig = (0, storage_1.loadGlobalConfig)();
|
|
130
|
+
const providerConfig = globalConfig?.providers[provider];
|
|
131
|
+
if (providerConfig?.models && providerConfig.models.length > 0) {
|
|
132
|
+
return providerConfig.models;
|
|
133
|
+
}
|
|
134
|
+
const providerDef = (0, providers_1.getProvider)(provider);
|
|
135
|
+
return providerDef?.defaultModels || [];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validate a config object
|
|
139
|
+
*/
|
|
140
|
+
function validateConfig(config) {
|
|
141
|
+
const errors = [];
|
|
142
|
+
// Validate provider
|
|
143
|
+
const providerDef = (0, providers_1.getProvider)(config.provider);
|
|
144
|
+
if (!providerDef) {
|
|
145
|
+
errors.push(`无效的 provider: ${config.provider}`);
|
|
146
|
+
}
|
|
147
|
+
// Validate API key
|
|
148
|
+
if (providerDef) {
|
|
149
|
+
const keyValidation = (0, providers_1.validateApiKey)(config.provider, config.apiKey);
|
|
150
|
+
if (!keyValidation.valid) {
|
|
151
|
+
errors.push(keyValidation.error || 'API Key 无效');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Validate model
|
|
155
|
+
const availableModels = getProviderModels(config.provider);
|
|
156
|
+
if (availableModels.length > 0 && !availableModels.includes(config.model)) {
|
|
157
|
+
errors.push(`模型 ${config.model} 在 provider ${config.provider} 中不可用。可用模型: ${availableModels.join(', ')}`);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
valid: errors.length === 0,
|
|
161
|
+
errors,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface ProviderConfig {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
models: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface GlobalConfig {
|
|
7
|
+
currentProvider: string;
|
|
8
|
+
providers: {
|
|
9
|
+
[key: string]: ProviderConfig;
|
|
10
|
+
};
|
|
11
|
+
defaults: {
|
|
12
|
+
provider: string;
|
|
13
|
+
model: string;
|
|
14
|
+
role: 'boss' | 'employee';
|
|
15
|
+
severity: 'mild' | 'medium' | 'extreme';
|
|
16
|
+
};
|
|
17
|
+
onboardingCompleted: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface ProjectConfig {
|
|
20
|
+
provider?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
role?: 'boss' | 'employee';
|
|
23
|
+
severity?: 'mild' | 'medium' | 'extreme';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the config directory path following XDG Base Directory Specification
|
|
27
|
+
*/
|
|
28
|
+
export declare function getConfigDir(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get the global config file path
|
|
31
|
+
*/
|
|
32
|
+
export declare function getGlobalConfigPath(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get the project config file path
|
|
35
|
+
*/
|
|
36
|
+
export declare function getProjectConfigPath(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Ensure config directory exists
|
|
39
|
+
*/
|
|
40
|
+
export declare function ensureConfigDir(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Load global config from file
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadGlobalConfig(): GlobalConfig | null;
|
|
45
|
+
/**
|
|
46
|
+
* Save global config to file
|
|
47
|
+
*/
|
|
48
|
+
export declare function saveGlobalConfig(config: GlobalConfig): void;
|
|
49
|
+
/**
|
|
50
|
+
* Load project config from file
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadProjectConfig(): ProjectConfig | null;
|
|
53
|
+
/**
|
|
54
|
+
* Check if global config exists
|
|
55
|
+
*/
|
|
56
|
+
export declare function hasGlobalConfig(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Check if onboarding has been completed
|
|
59
|
+
*/
|
|
60
|
+
export declare function isOnboardingCompleted(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get API key for a provider from config
|
|
63
|
+
*/
|
|
64
|
+
export declare function getProviderApiKey(provider: string): string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Get current provider
|
|
67
|
+
*/
|
|
68
|
+
export declare function getCurrentProvider(): string | null;
|
|
69
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/config/storage.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;KAC/B,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;QAC1B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;KACzC,CAAC;IACF,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAUrC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAatD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAS3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAaxD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAGlD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getConfigDir = getConfigDir;
|
|
7
|
+
exports.getGlobalConfigPath = getGlobalConfigPath;
|
|
8
|
+
exports.getProjectConfigPath = getProjectConfigPath;
|
|
9
|
+
exports.ensureConfigDir = ensureConfigDir;
|
|
10
|
+
exports.loadGlobalConfig = loadGlobalConfig;
|
|
11
|
+
exports.saveGlobalConfig = saveGlobalConfig;
|
|
12
|
+
exports.loadProjectConfig = loadProjectConfig;
|
|
13
|
+
exports.hasGlobalConfig = hasGlobalConfig;
|
|
14
|
+
exports.isOnboardingCompleted = isOnboardingCompleted;
|
|
15
|
+
exports.getProviderApiKey = getProviderApiKey;
|
|
16
|
+
exports.getCurrentProvider = getCurrentProvider;
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const fs_1 = __importDefault(require("fs"));
|
|
20
|
+
/**
|
|
21
|
+
* Get the config directory path following XDG Base Directory Specification
|
|
22
|
+
*/
|
|
23
|
+
function getConfigDir() {
|
|
24
|
+
const platform = process.platform;
|
|
25
|
+
if (platform === 'win32') {
|
|
26
|
+
// Windows: %APPDATA%\pua-cli
|
|
27
|
+
return path_1.default.join(process.env.APPDATA || path_1.default.join(os_1.default.homedir(), 'AppData', 'Roaming'), 'pua-cli');
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Linux/macOS: ~/.config/pua-cli
|
|
31
|
+
return path_1.default.join(os_1.default.homedir(), '.config', 'pua-cli');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the global config file path
|
|
36
|
+
*/
|
|
37
|
+
function getGlobalConfigPath() {
|
|
38
|
+
return path_1.default.join(getConfigDir(), 'config.json');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the project config file path
|
|
42
|
+
*/
|
|
43
|
+
function getProjectConfigPath() {
|
|
44
|
+
return path_1.default.join(process.cwd(), '.pua.json');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Ensure config directory exists
|
|
48
|
+
*/
|
|
49
|
+
function ensureConfigDir() {
|
|
50
|
+
const configDir = getConfigDir();
|
|
51
|
+
if (!fs_1.default.existsSync(configDir)) {
|
|
52
|
+
fs_1.default.mkdirSync(configDir, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Load global config from file
|
|
57
|
+
*/
|
|
58
|
+
function loadGlobalConfig() {
|
|
59
|
+
const configPath = getGlobalConfigPath();
|
|
60
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const content = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
65
|
+
return JSON.parse(content);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to load config from ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Save global config to file
|
|
73
|
+
*/
|
|
74
|
+
function saveGlobalConfig(config) {
|
|
75
|
+
ensureConfigDir();
|
|
76
|
+
const configPath = getGlobalConfigPath();
|
|
77
|
+
try {
|
|
78
|
+
fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new Error(`Failed to save config to ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Load project config from file
|
|
86
|
+
*/
|
|
87
|
+
function loadProjectConfig() {
|
|
88
|
+
const configPath = getProjectConfigPath();
|
|
89
|
+
if (!fs_1.default.existsSync(configPath)) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const content = fs_1.default.readFileSync(configPath, 'utf-8');
|
|
94
|
+
return JSON.parse(content);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
throw new Error(`Failed to load project config from ${configPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if global config exists
|
|
102
|
+
*/
|
|
103
|
+
function hasGlobalConfig() {
|
|
104
|
+
return fs_1.default.existsSync(getGlobalConfigPath());
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if onboarding has been completed
|
|
108
|
+
*/
|
|
109
|
+
function isOnboardingCompleted() {
|
|
110
|
+
const config = loadGlobalConfig();
|
|
111
|
+
return config?.onboardingCompleted ?? false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get API key for a provider from config
|
|
115
|
+
*/
|
|
116
|
+
function getProviderApiKey(provider) {
|
|
117
|
+
const config = loadGlobalConfig();
|
|
118
|
+
return config?.providers[provider]?.apiKey ?? null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get current provider
|
|
122
|
+
*/
|
|
123
|
+
function getCurrentProvider() {
|
|
124
|
+
const config = loadGlobalConfig();
|
|
125
|
+
return config?.currentProvider ?? null;
|
|
126
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/config/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AA6BpB;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,6BAA6B;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACpG,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjI,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,MAAM,EAAE,mBAAmB,IAAI,KAAK,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Message } from '../llm/base';
|
|
2
|
+
export interface SessionHistory {
|
|
3
|
+
messages: Message[];
|
|
4
|
+
createdAt: Date;
|
|
5
|
+
lastUpdatedAt: Date;
|
|
6
|
+
}
|
|
7
|
+
export declare class SessionManager {
|
|
8
|
+
private sessions;
|
|
9
|
+
private currentSessionId;
|
|
10
|
+
/**
|
|
11
|
+
* Create a new session
|
|
12
|
+
*/
|
|
13
|
+
createSession(sessionId: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get current session
|
|
16
|
+
*/
|
|
17
|
+
getCurrentSession(): SessionHistory | null;
|
|
18
|
+
/**
|
|
19
|
+
* Add a message to current session
|
|
20
|
+
*/
|
|
21
|
+
addMessage(message: Message): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get messages from current session
|
|
24
|
+
*/
|
|
25
|
+
getMessages(): Message[];
|
|
26
|
+
/**
|
|
27
|
+
* Clear current session messages
|
|
28
|
+
*/
|
|
29
|
+
clearCurrentSession(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Delete a session
|
|
32
|
+
*/
|
|
33
|
+
deleteSession(sessionId: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get session info as string
|
|
36
|
+
*/
|
|
37
|
+
getSessionInfo(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get formatted history for display
|
|
40
|
+
*/
|
|
41
|
+
getFormattedHistory(): string;
|
|
42
|
+
/**
|
|
43
|
+
* Set current session
|
|
44
|
+
*/
|
|
45
|
+
setCurrentSession(sessionId: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Check if current session has messages
|
|
48
|
+
*/
|
|
49
|
+
hasMessages(): boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare const sessionManager: SessionManager;
|
|
52
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/history/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,IAAI,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,gBAAgB,CAAuB;IAE/C;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC;;OAEG;IACH,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAK1C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQlC;;OAEG;IACH,WAAW,IAAI,OAAO,EAAE;IAKxB;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAQ3B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOtC;;OAEG;IACH,cAAc,IAAI,MAAM;IAoBxB;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAqB7B;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ1C;;OAEG;IACH,WAAW,IAAI,OAAO;CAIvB;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|