yuangs 1.3.72 → 1.3.73

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.
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.capabilitySystem = exports.CapabilitySystem = void 0;
4
+ const modelMatcher_1 = require("./modelMatcher");
5
+ const configMerge_1 = require("./configMerge");
6
+ const executionRecord_1 = require("./executionRecord");
7
+ const executionStore_1 = require("./executionStore");
8
+ const replayEngine_1 = require("./replayEngine");
9
+ class CapabilitySystem {
10
+ primaryModels = [];
11
+ fallbackModels = [];
12
+ constructor() {
13
+ this.initializeDefaultModels();
14
+ }
15
+ initializeDefaultModels() {
16
+ this.primaryModels = [
17
+ {
18
+ name: 'gemini-pro-latest',
19
+ provider: 'google',
20
+ atomicCapabilities: [
21
+ require('./capabilities').AtomicCapability.TEXT_GENERATION,
22
+ require('./capabilities').AtomicCapability.CODE_GENERATION,
23
+ require('./capabilities').AtomicCapability.REASONING,
24
+ require('./capabilities').AtomicCapability.LONG_CONTEXT,
25
+ require('./capabilities').AtomicCapability.STREAMING,
26
+ ],
27
+ contextWindow: 128000,
28
+ costProfile: 'high',
29
+ },
30
+ {
31
+ name: 'gemini-flash-latest',
32
+ provider: 'google',
33
+ atomicCapabilities: [
34
+ require('./capabilities').AtomicCapability.TEXT_GENERATION,
35
+ require('./capabilities').AtomicCapability.CODE_GENERATION,
36
+ require('./capabilities').AtomicCapability.REASONING,
37
+ require('./capabilities').AtomicCapability.STREAMING,
38
+ ],
39
+ contextWindow: 32000,
40
+ costProfile: 'medium',
41
+ },
42
+ {
43
+ name: 'Assistant',
44
+ provider: 'aiproxy',
45
+ atomicCapabilities: [
46
+ require('./capabilities').AtomicCapability.TEXT_GENERATION,
47
+ require('./capabilities').AtomicCapability.CODE_GENERATION,
48
+ require('./capabilities').AtomicCapability.REASONING,
49
+ ],
50
+ contextWindow: 8000,
51
+ costProfile: 'low',
52
+ },
53
+ ];
54
+ this.fallbackModels = [
55
+ {
56
+ name: 'gemini-flash-lite-latest',
57
+ provider: 'google',
58
+ atomicCapabilities: [
59
+ require('./capabilities').AtomicCapability.TEXT_GENERATION,
60
+ require('./capabilities').AtomicCapability.REASONING,
61
+ ],
62
+ contextWindow: 16000,
63
+ costProfile: 'low',
64
+ },
65
+ ];
66
+ }
67
+ matchCapability(requirement) {
68
+ const allModels = this.getAllModels();
69
+ const primaryModels = [...this.primaryModels, ...this.loadCustomModels()];
70
+ return (0, modelMatcher_1.matchModelWithFallback)(primaryModels, this.fallbackModels, requirement);
71
+ }
72
+ loadMergedConfig() {
73
+ const builtin = {
74
+ aiProxyUrl: 'https://aiproxy.want.biz/v1/chat/completions',
75
+ defaultModel: 'Assistant',
76
+ accountType: 'free',
77
+ };
78
+ const filePaths = (0, configMerge_1.getConfigFilePaths)();
79
+ const projectConfig = filePaths.project ? (0, configMerge_1.loadConfigAt)(filePaths.project) : null;
80
+ const userGlobal = (0, configMerge_1.loadConfigAt)(filePaths.userGlobal);
81
+ return (0, configMerge_1.mergeConfigs)(builtin, userGlobal, projectConfig, null);
82
+ }
83
+ loadCustomModels() {
84
+ const filePaths = (0, configMerge_1.getConfigFilePaths)();
85
+ const projectConfig = filePaths.project ? (0, configMerge_1.loadConfigAt)(filePaths.project) : null;
86
+ const userGlobal = (0, configMerge_1.loadConfigAt)(filePaths.userGlobal);
87
+ const customModelsArray = [];
88
+ if (userGlobal?.models && Array.isArray(userGlobal.models)) {
89
+ customModelsArray.push(...userGlobal.models);
90
+ }
91
+ if (projectConfig?.models && Array.isArray(projectConfig.models)) {
92
+ customModelsArray.push(...projectConfig.models);
93
+ }
94
+ return customModelsArray;
95
+ }
96
+ getAllModels() {
97
+ const customModels = this.loadCustomModels();
98
+ return [...this.primaryModels, ...this.fallbackModels, ...customModels];
99
+ }
100
+ createAndSaveExecutionRecord(commandName, requirement, matchResult, command) {
101
+ const config = this.loadMergedConfig();
102
+ const record = (0, executionRecord_1.createExecutionRecord)(commandName, requirement, config, matchResult, { success: matchResult.selected !== null }, command);
103
+ const filePath = (0, executionStore_1.saveExecutionRecord)(record);
104
+ return record.id;
105
+ }
106
+ replayExecution(recordId, options) {
107
+ return replayEngine_1.replayEngine.replay(recordId, options);
108
+ }
109
+ explainConfig() {
110
+ const config = this.loadMergedConfig();
111
+ return (0, configMerge_1.dumpConfigSnapshot)(config);
112
+ }
113
+ }
114
+ exports.CapabilitySystem = CapabilitySystem;
115
+ exports.capabilitySystem = new CapabilitySystem();
116
+ //# sourceMappingURL=capabilitySystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilitySystem.js","sourceRoot":"","sources":["../../src/core/capabilitySystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type ConfigSource = 'built-in' | 'user-global' | 'project' | 'command-override';
2
+ export interface ConfigFieldSource<T = unknown> {
3
+ value: T;
4
+ source: ConfigSource;
5
+ filePath?: string;
6
+ }
7
+ export interface MergedConfig {
8
+ aiProxyUrl: ConfigFieldSource<string>;
9
+ defaultModel: ConfigFieldSource<string>;
10
+ accountType: ConfigFieldSource<'free' | 'pro'>;
11
+ [key: string]: ConfigFieldSource<unknown>;
12
+ }
13
+ export declare function loadConfigAt(filePath: string): Record<string, unknown> | null;
14
+ export declare function mergeConfigs(builtin: Record<string, unknown>, userGlobal: Record<string, unknown> | null, project: Record<string, unknown> | null, commandOverride: Record<string, unknown> | null): MergedConfig;
15
+ export declare function dumpConfigSnapshot(config: MergedConfig): string;
16
+ export declare function getConfigFilePaths(): {
17
+ userGlobal: string;
18
+ project: string | null;
19
+ };
@@ -0,0 +1,93 @@
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.loadConfigAt = loadConfigAt;
7
+ exports.mergeConfigs = mergeConfigs;
8
+ exports.dumpConfigSnapshot = dumpConfigSnapshot;
9
+ exports.getConfigFilePaths = getConfigFilePaths;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = __importDefault(require("os"));
13
+ const js_yaml_1 = __importDefault(require("js-yaml"));
14
+ function loadConfigAt(filePath) {
15
+ if (!fs_1.default.existsSync(filePath)) {
16
+ return null;
17
+ }
18
+ try {
19
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
20
+ if (filePath.endsWith('.yaml') || filePath.endsWith('.yml')) {
21
+ return js_yaml_1.default.load(content);
22
+ }
23
+ return JSON.parse(content);
24
+ }
25
+ catch (error) {
26
+ console.warn(`Failed to load config from ${filePath}:`, error);
27
+ return null;
28
+ }
29
+ }
30
+ function mergeConfigs(builtin, userGlobal, project, commandOverride) {
31
+ const merged = {};
32
+ const addField = (key, value, source, filePath) => {
33
+ merged[key] = { value, source, filePath };
34
+ };
35
+ Object.entries(builtin).forEach(([key, value]) => {
36
+ addField(key, value, 'built-in');
37
+ });
38
+ if (userGlobal) {
39
+ Object.entries(userGlobal).forEach(([key, value]) => {
40
+ addField(key, value, 'user-global', path_1.default.join(os_1.default.homedir(), '.yuangs.json'));
41
+ });
42
+ }
43
+ if (project) {
44
+ Object.entries(project).forEach(([key, value]) => {
45
+ addField(key, value, 'project');
46
+ });
47
+ }
48
+ if (commandOverride) {
49
+ Object.entries(commandOverride).forEach(([key, value]) => {
50
+ addField(key, value, 'command-override');
51
+ });
52
+ }
53
+ return merged;
54
+ }
55
+ function dumpConfigSnapshot(config) {
56
+ const output = {};
57
+ Object.entries(config).forEach(([key, field]) => {
58
+ output[key] = {
59
+ value: field.value,
60
+ source: field.source,
61
+ filePath: field.filePath,
62
+ };
63
+ });
64
+ return JSON.stringify(output, null, 2);
65
+ }
66
+ function findProjectConfig(cwd = process.cwd()) {
67
+ let dir = cwd;
68
+ const configFiles = ['.yuangs.json', '.yuangs.yaml', '.yuangs.yml', 'yuangs.config.json'];
69
+ while (dir && dir !== path_1.default.dirname(dir)) {
70
+ for (const filename of configFiles) {
71
+ const candidate = path_1.default.join(dir, filename);
72
+ if (fs_1.default.existsSync(candidate)) {
73
+ return candidate;
74
+ }
75
+ }
76
+ dir = path_1.default.dirname(dir);
77
+ }
78
+ const root = path_1.default.parse(cwd).root;
79
+ for (const filename of configFiles) {
80
+ const rootCandidate = path_1.default.join(root, filename);
81
+ if (fs_1.default.existsSync(rootCandidate)) {
82
+ return rootCandidate;
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ function getConfigFilePaths() {
88
+ return {
89
+ userGlobal: path_1.default.join(os_1.default.homedir(), '.yuangs.json'),
90
+ project: findProjectConfig(),
91
+ };
92
+ }
93
+ //# sourceMappingURL=configMerge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configMerge.js","sourceRoot":"","sources":["../../src/core/configMerge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { MergedConfig } from './configMerge';
2
+ import { ModelCapabilities, CapabilityMatchExplanation } from './modelMatcher';
3
+ import { CapabilityRequirement } from './modelMatcher';
4
+ export interface ExecutionMeta {
5
+ commandName: string;
6
+ timestamp: string;
7
+ toolVersion: string;
8
+ projectPath: string;
9
+ }
10
+ export interface CapabilityIntent {
11
+ required: string[];
12
+ preferred: string[];
13
+ capabilityVersion: string;
14
+ }
15
+ export interface ModelDecision {
16
+ candidateModels: CapabilityMatchExplanation[];
17
+ selectedModel: ModelCapabilities | null;
18
+ usedFallback: boolean;
19
+ fallbackReason?: string;
20
+ }
21
+ export interface ExecutionOutcome {
22
+ success: boolean;
23
+ failureReason?: 'capability-mismatch' | 'provider-error' | 'user-abort' | 'timeout' | 'other';
24
+ tokenCount?: number;
25
+ latencyMs?: number;
26
+ }
27
+ export interface ExecutionRecord {
28
+ id: string;
29
+ meta: ExecutionMeta;
30
+ intent: CapabilityIntent;
31
+ configSnapshot: MergedConfig;
32
+ decision: ModelDecision;
33
+ outcome: ExecutionOutcome;
34
+ command?: string;
35
+ }
36
+ export declare function createExecutionId(): string;
37
+ export declare function createExecutionRecord(commandName: string, requirement: CapabilityRequirement, config: MergedConfig, matchResult: any, outcome?: Partial<ExecutionOutcome>, command?: string): ExecutionRecord;
38
+ export declare function serializeExecutionRecord(record: ExecutionRecord): string;
39
+ export declare function deserializeExecutionRecord(json: string): ExecutionRecord;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createExecutionId = createExecutionId;
4
+ exports.createExecutionRecord = createExecutionRecord;
5
+ exports.serializeExecutionRecord = serializeExecutionRecord;
6
+ exports.deserializeExecutionRecord = deserializeExecutionRecord;
7
+ function createExecutionId() {
8
+ return `exec_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
9
+ }
10
+ function createExecutionRecord(commandName, requirement, config, matchResult, outcome = {}, command) {
11
+ const version = require('../../package.json').version;
12
+ return {
13
+ id: createExecutionId(),
14
+ meta: {
15
+ commandName,
16
+ timestamp: new Date().toISOString(),
17
+ toolVersion: version,
18
+ projectPath: process.cwd(),
19
+ },
20
+ intent: {
21
+ required: requirement.required.map(String),
22
+ preferred: requirement.preferred.map(String),
23
+ capabilityVersion: require('./capabilities').CAPABILITY_VERSION,
24
+ },
25
+ configSnapshot: config,
26
+ decision: {
27
+ candidateModels: matchResult.candidates || [],
28
+ selectedModel: matchResult.selected,
29
+ usedFallback: matchResult.fallbackOccurred,
30
+ },
31
+ outcome: {
32
+ success: outcome.success ?? false,
33
+ ...outcome,
34
+ },
35
+ command,
36
+ };
37
+ }
38
+ function serializeExecutionRecord(record) {
39
+ return JSON.stringify(record, null, 2);
40
+ }
41
+ function deserializeExecutionRecord(json) {
42
+ return JSON.parse(json);
43
+ }
44
+ //# sourceMappingURL=executionRecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionRecord.js","sourceRoot":"","sources":["../../src/core/executionRecord.ts"],"names":[],"mappings":";;AAyCA,8CAEC;AAED,sDAmCC;AAED,4DAEC;AAED,gEAEC;AA/CD,SAAgB,iBAAiB;IAC/B,OAAO,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAgB,qBAAqB,CACnC,WAAmB,EACnB,WAAkC,EAClC,MAAoB,EACpB,WAAgB,EAChB,UAAqC,EAAE,EACvC,OAAgB;IAEhB,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;IAEtD,OAAO;QACL,EAAE,EAAE,iBAAiB,EAAE;QACvB,IAAI,EAAE;YACJ,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;SAC3B;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1C,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5C,iBAAiB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,kBAAkB;SAChE;QACD,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE;YACR,eAAe,EAAE,WAAW,CAAC,UAAU,IAAI,EAAE;YAC7C,aAAa,EAAE,WAAW,CAAC,QAAQ;YACnC,YAAY,EAAE,WAAW,CAAC,gBAAgB;SAC3C;QACD,OAAO,EAAE;YACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,GAAG,OAAO;SACX;QACD,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAgB,wBAAwB,CAAC,MAAuB;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAgB,0BAA0B,CAAC,IAAY;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { ExecutionRecord } from './executionRecord';
2
+ export declare function ensureRecordDir(): void;
3
+ export declare function saveExecutionRecord(record: ExecutionRecord): string;
4
+ export declare function loadExecutionRecord(id: string): ExecutionRecord | null;
5
+ export declare function listExecutionRecords(limit?: number): ExecutionRecord[];
6
+ export declare function deleteExecutionRecord(id: string): boolean;
7
+ export declare function clearAllExecutionRecords(): void;
@@ -0,0 +1,93 @@
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.ensureRecordDir = ensureRecordDir;
7
+ exports.saveExecutionRecord = saveExecutionRecord;
8
+ exports.loadExecutionRecord = loadExecutionRecord;
9
+ exports.listExecutionRecords = listExecutionRecords;
10
+ exports.deleteExecutionRecord = deleteExecutionRecord;
11
+ exports.clearAllExecutionRecords = clearAllExecutionRecords;
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const executionRecord_1 = require("./executionRecord");
16
+ const RECORD_DIR = path_1.default.join(os_1.default.homedir(), '.yuangs', 'executions');
17
+ function ensureRecordDir() {
18
+ if (!fs_1.default.existsSync(RECORD_DIR)) {
19
+ fs_1.default.mkdirSync(RECORD_DIR, { recursive: true });
20
+ }
21
+ }
22
+ function saveExecutionRecord(record) {
23
+ ensureRecordDir();
24
+ const filename = `${record.id}.json`;
25
+ const filepath = path_1.default.join(RECORD_DIR, filename);
26
+ fs_1.default.writeFileSync(filepath, (0, executionRecord_1.serializeExecutionRecord)(record), 'utf8');
27
+ return filepath;
28
+ }
29
+ function loadExecutionRecord(id) {
30
+ ensureRecordDir();
31
+ const filename = `${id}.json`;
32
+ const filepath = path_1.default.join(RECORD_DIR, filename);
33
+ if (!fs_1.default.existsSync(filepath)) {
34
+ return null;
35
+ }
36
+ try {
37
+ const content = fs_1.default.readFileSync(filepath, 'utf8');
38
+ return (0, executionRecord_1.deserializeExecutionRecord)(content);
39
+ }
40
+ catch (error) {
41
+ console.error(`Failed to load execution record ${id}:`, error);
42
+ return null;
43
+ }
44
+ }
45
+ function listExecutionRecords(limit = 50) {
46
+ ensureRecordDir();
47
+ const files = fs_1.default.readdirSync(RECORD_DIR)
48
+ .filter(f => f.endsWith('.json'))
49
+ .sort((a, b) => {
50
+ const statA = fs_1.default.statSync(path_1.default.join(RECORD_DIR, a));
51
+ const statB = fs_1.default.statSync(path_1.default.join(RECORD_DIR, b));
52
+ return statB.mtimeMs - statA.mtimeMs;
53
+ })
54
+ .slice(0, limit);
55
+ const records = [];
56
+ for (const file of files) {
57
+ const record = loadExecutionRecord(file.replace('.json', ''));
58
+ if (record) {
59
+ records.push(record);
60
+ }
61
+ }
62
+ return records;
63
+ }
64
+ function deleteExecutionRecord(id) {
65
+ ensureRecordDir();
66
+ const filename = `${id}.json`;
67
+ const filepath = path_1.default.join(RECORD_DIR, filename);
68
+ if (!fs_1.default.existsSync(filepath)) {
69
+ return false;
70
+ }
71
+ try {
72
+ fs_1.default.unlinkSync(filepath);
73
+ return true;
74
+ }
75
+ catch (error) {
76
+ console.error(`Failed to delete execution record ${id}:`, error);
77
+ return false;
78
+ }
79
+ }
80
+ function clearAllExecutionRecords() {
81
+ ensureRecordDir();
82
+ const files = fs_1.default.readdirSync(RECORD_DIR).filter(f => f.endsWith('.json'));
83
+ for (const file of files) {
84
+ const filepath = path_1.default.join(RECORD_DIR, file);
85
+ try {
86
+ fs_1.default.unlinkSync(filepath);
87
+ }
88
+ catch (error) {
89
+ console.error(`Failed to delete ${filepath}:`, error);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=executionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionStore.js","sourceRoot":"","sources":["../../src/core/executionStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { AtomicCapability, ConstraintCapability } from './capabilities';
2
+ export interface ModelCapabilities {
3
+ name: string;
4
+ provider: string;
5
+ atomicCapabilities: AtomicCapability[];
6
+ contextWindow?: number;
7
+ costProfile?: 'low' | 'medium' | 'high';
8
+ }
9
+ export interface CapabilityRequirement {
10
+ required: AtomicCapability[];
11
+ preferred: AtomicCapability[];
12
+ constraints?: ConstraintCapability[];
13
+ }
14
+ export interface CapabilityMatchExplanation {
15
+ modelName: string;
16
+ provider: string;
17
+ hasRequired: boolean;
18
+ hasPreferred: AtomicCapability[];
19
+ missingRequired: AtomicCapability[];
20
+ reason: string;
21
+ }
22
+ export interface CapabilityMatchResult {
23
+ selected: ModelCapabilities | null;
24
+ candidates: CapabilityMatchExplanation[];
25
+ fallbackOccurred: boolean;
26
+ }
27
+ export declare function matchModel(models: ModelCapabilities[], requirement: CapabilityRequirement): CapabilityMatchResult;
28
+ export declare function matchModelWithFallback(models: ModelCapabilities[], fallbackModels: ModelCapabilities[], requirement: CapabilityRequirement): CapabilityMatchResult;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchModel = matchModel;
4
+ exports.matchModelWithFallback = matchModelWithFallback;
5
+ function matchModel(models, requirement) {
6
+ const explanations = [];
7
+ for (const model of models) {
8
+ const hasRequired = requirement.required.every(cap => model.atomicCapabilities.includes(cap));
9
+ const missingRequired = requirement.required.filter(cap => !model.atomicCapabilities.includes(cap));
10
+ const hasPreferred = requirement.preferred.filter(cap => model.atomicCapabilities.includes(cap));
11
+ const explanation = {
12
+ modelName: model.name,
13
+ provider: model.provider,
14
+ hasRequired,
15
+ hasPreferred,
16
+ missingRequired,
17
+ reason: hasRequired
18
+ ? `Has all required capabilities. Matches ${hasPreferred.length}/${requirement.preferred.length} preferred.`
19
+ : `Missing required capabilities: ${missingRequired.map(c => String(c)).join(', ')}`,
20
+ };
21
+ explanations.push(explanation);
22
+ }
23
+ const matchingModels = explanations.filter(e => e.hasRequired);
24
+ if (matchingModels.length === 0) {
25
+ return {
26
+ selected: null,
27
+ candidates: explanations,
28
+ fallbackOccurred: false,
29
+ };
30
+ }
31
+ const bestMatch = matchingModels[0];
32
+ const selectedModel = models.find(m => m.name === bestMatch.modelName);
33
+ return {
34
+ selected: selectedModel || null,
35
+ candidates: explanations,
36
+ fallbackOccurred: false,
37
+ };
38
+ }
39
+ function matchModelWithFallback(models, fallbackModels, requirement) {
40
+ const primaryResult = matchModel(models, requirement);
41
+ if (primaryResult.selected) {
42
+ return primaryResult;
43
+ }
44
+ const fallbackResult = matchModel(fallbackModels, requirement);
45
+ return {
46
+ ...fallbackResult,
47
+ fallbackOccurred: fallbackResult.selected !== null,
48
+ };
49
+ }
50
+ //# sourceMappingURL=modelMatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelMatcher.js","sourceRoot":"","sources":["../../src/core/modelMatcher.ts"],"names":[],"mappings":";;AA+BA,gCAmDC;AAED,wDAiBC;AAtED,SAAgB,UAAU,CACxB,MAA2B,EAC3B,WAAkC;IAElC,MAAM,YAAY,GAAiC,EAAE,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACnD,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CACvC,CAAC;QAEF,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxD,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CACxC,CAAC;QAEF,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACtD,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CACvC,CAAC;QAEF,MAAM,WAAW,GAA+B;YAC9C,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW;YACX,YAAY;YACZ,eAAe;YACf,MAAM,EAAE,WAAW;gBACjB,CAAC,CAAC,0CAA0C,YAAY,CAAC,MAAM,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,aAAa;gBAC5G,CAAC,CAAC,kCAAkC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvF,CAAC;QAEF,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE/D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,YAAY;YACxB,gBAAgB,EAAE,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO;QACL,QAAQ,EAAE,aAAa,IAAI,IAAI;QAC/B,UAAU,EAAE,YAAY;QACxB,gBAAgB,EAAE,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CACpC,MAA2B,EAC3B,cAAmC,EACnC,WAAkC;IAElC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEtD,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAE/D,OAAO;QACL,GAAG,cAAc;QACjB,gBAAgB,EAAE,cAAc,CAAC,QAAQ,KAAK,IAAI;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type ReplayMode = 'strict' | 'compatible' | 're-evaluate';
2
+ export interface ReplayOptions {
3
+ mode: ReplayMode;
4
+ skipAI?: boolean;
5
+ verbose?: boolean;
6
+ }
7
+ export interface ReplayResult {
8
+ success: boolean;
9
+ message: string;
10
+ executedModel?: string;
11
+ deviationReason?: string;
12
+ }
13
+ export declare class ReplayEngine {
14
+ replay(recordId: string, options?: ReplayOptions): Promise<ReplayResult>;
15
+ private strictReplay;
16
+ private compatibleReplay;
17
+ private reEvaluate;
18
+ }
19
+ export declare const replayEngine: ReplayEngine;
@@ -0,0 +1,98 @@
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.replayEngine = exports.ReplayEngine = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const executionStore_1 = require("./executionStore");
9
+ class ReplayEngine {
10
+ async replay(recordId, options = { mode: 'strict' }) {
11
+ const record = (0, executionStore_1.loadExecutionRecord)(recordId);
12
+ if (!record) {
13
+ return {
14
+ success: false,
15
+ message: `Execution record ${recordId} not found`,
16
+ };
17
+ }
18
+ if (options.mode === 'strict') {
19
+ return this.strictReplay(record, options);
20
+ }
21
+ if (options.mode === 'compatible') {
22
+ return this.compatibleReplay(record, options);
23
+ }
24
+ return this.reEvaluate(record, options);
25
+ }
26
+ async strictReplay(record, options) {
27
+ const selectedModel = record.decision.selectedModel;
28
+ if (options.verbose) {
29
+ console.log(chalk_1.default.cyan('[Strict Replay]'));
30
+ console.log(chalk_1.default.gray(` Original Model: ${selectedModel?.name || 'N/A'}`));
31
+ console.log(chalk_1.default.gray(` Original Provider: ${selectedModel?.provider || 'N/A'}`));
32
+ console.log(chalk_1.default.gray(` Original Timestamp: ${record.meta.timestamp}`));
33
+ console.log(chalk_1.default.gray(` Original Command: ${record.meta.commandName}`));
34
+ }
35
+ if (options.skipAI) {
36
+ return {
37
+ success: true,
38
+ message: 'Strict replay prepared (AI execution skipped)',
39
+ executedModel: selectedModel?.name ?? undefined,
40
+ };
41
+ }
42
+ if (!record.command) {
43
+ return {
44
+ success: false,
45
+ message: 'Strict replay: No command to execute (command not stored in record)',
46
+ executedModel: selectedModel?.name ?? undefined,
47
+ };
48
+ }
49
+ const { exec } = require('./executor');
50
+ try {
51
+ console.log(chalk_1.default.gray('[Strict Replay] Executing with original parameters...'));
52
+ const result = await exec(record.command);
53
+ return {
54
+ success: result.code === 0 || result.code === null,
55
+ message: result.code === 0 || result.code === null
56
+ ? 'Strict replay completed successfully'
57
+ : `Strict replay failed with code ${result.code}`,
58
+ executedModel: selectedModel?.name ?? undefined,
59
+ };
60
+ }
61
+ catch (error) {
62
+ const message = error instanceof Error ? error.message : String(error);
63
+ return {
64
+ success: false,
65
+ message: `Strict replay error: ${message}`,
66
+ executedModel: selectedModel?.name ?? undefined,
67
+ };
68
+ }
69
+ }
70
+ async compatibleReplay(record, options) {
71
+ const originalModel = record.decision.selectedModel;
72
+ if (options.verbose) {
73
+ console.log(chalk_1.default.cyan('[Compatible Replay]'));
74
+ console.log(chalk_1.default.gray(` Original Model: ${originalModel?.name || 'N/A'}`));
75
+ console.log(chalk_1.default.gray(` Will attempt fallback if original unavailable`));
76
+ }
77
+ return {
78
+ success: false,
79
+ message: 'Compatible replay not yet implemented in Phase 1',
80
+ executedModel: originalModel?.name,
81
+ deviationReason: 'Phase 1 only supports strict replay',
82
+ };
83
+ }
84
+ async reEvaluate(record, options) {
85
+ if (options.verbose) {
86
+ console.log(chalk_1.default.cyan('[Re-evaluate]'));
87
+ console.log(chalk_1.default.gray(` Will re-run capability matching with current config`));
88
+ console.log(chalk_1.default.gray(` Original Intent: ${record.intent.required.join(', ')}`));
89
+ }
90
+ return {
91
+ success: false,
92
+ message: 'Re-evaluate not yet implemented in Phase 1',
93
+ };
94
+ }
95
+ }
96
+ exports.ReplayEngine = ReplayEngine;
97
+ exports.replayEngine = new ReplayEngine();
98
+ //# sourceMappingURL=replayEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayEngine.js","sourceRoot":"","sources":["../../src/core/replayEngine.ts"],"names":[],"mappings":"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"}