@shin1ohno/sage 0.1.0 → 0.2.1
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 +79 -114
- package/dist/config/storage/storage-factory.d.ts +5 -1
- package/dist/config/storage/storage-factory.d.ts.map +1 -1
- package/dist/config/storage/storage-factory.js +12 -19
- package/dist/config/storage/storage-factory.js.map +1 -1
- package/dist/core/sage-core.d.ts +10 -5
- package/dist/core/sage-core.d.ts.map +1 -1
- package/dist/core/sage-core.js +28 -51
- package/dist/core/sage-core.js.map +1 -1
- package/dist/index.js +335 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/apple-reminders.d.ts +49 -0
- package/dist/integrations/apple-reminders.d.ts.map +1 -1
- package/dist/integrations/apple-reminders.js +229 -0
- package/dist/integrations/apple-reminders.js.map +1 -1
- package/dist/integrations/notion-mcp.d.ts +136 -1
- package/dist/integrations/notion-mcp.d.ts.map +1 -1
- package/dist/integrations/notion-mcp.js +449 -1
- package/dist/integrations/notion-mcp.js.map +1 -1
- package/dist/integrations/task-synchronizer.d.ts +124 -0
- package/dist/integrations/task-synchronizer.d.ts.map +1 -0
- package/dist/integrations/task-synchronizer.js +363 -0
- package/dist/integrations/task-synchronizer.js.map +1 -0
- package/dist/integrations/todo-list-manager.d.ts +185 -0
- package/dist/integrations/todo-list-manager.d.ts.map +1 -0
- package/dist/integrations/todo-list-manager.js +581 -0
- package/dist/integrations/todo-list-manager.js.map +1 -0
- package/dist/platform/adapter-factory.d.ts.map +1 -1
- package/dist/platform/adapter-factory.js +4 -8
- package/dist/platform/adapter-factory.js.map +1 -1
- package/dist/platform/adapters/mcp-adapter.js +1 -1
- package/dist/platform/adapters/mcp-adapter.js.map +1 -1
- package/dist/platform/adapters/remote-mcp-adapter.d.ts +34 -0
- package/dist/platform/adapters/remote-mcp-adapter.d.ts.map +1 -0
- package/dist/platform/adapters/remote-mcp-adapter.js +54 -0
- package/dist/platform/adapters/remote-mcp-adapter.js.map +1 -0
- package/dist/platform/detector.d.ts +5 -16
- package/dist/platform/detector.d.ts.map +1 -1
- package/dist/platform/detector.js +52 -108
- package/dist/platform/detector.js.map +1 -1
- package/dist/platform/index.d.ts +0 -2
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +0 -2
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/types.d.ts +20 -62
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/platform/types.js +6 -11
- package/dist/platform/types.js.map +1 -1
- package/dist/remote/cloud-config.d.ts +139 -0
- package/dist/remote/cloud-config.d.ts.map +1 -0
- package/dist/remote/cloud-config.js +229 -0
- package/dist/remote/cloud-config.js.map +1 -0
- package/dist/remote/hybrid-integration.d.ts +109 -0
- package/dist/remote/hybrid-integration.d.ts.map +1 -0
- package/dist/remote/hybrid-integration.js +230 -0
- package/dist/remote/hybrid-integration.js.map +1 -0
- package/dist/remote/remote-mcp-server.d.ts +244 -0
- package/dist/remote/remote-mcp-server.d.ts.map +1 -0
- package/dist/remote/remote-mcp-server.js +507 -0
- package/dist/remote/remote-mcp-server.js.map +1 -0
- package/dist/utils/priority.d.ts.map +1 -1
- package/dist/utils/priority.js +18 -5
- package/dist/utils/priority.js.map +1 -1
- package/dist/utils/stakeholders.d.ts +4 -0
- package/dist/utils/stakeholders.d.ts.map +1 -1
- package/dist/utils/stakeholders.js +45 -4
- package/dist/utils/stakeholders.js.map +1 -1
- package/dist/utils/task-splitter.d.ts.map +1 -1
- package/dist/utils/task-splitter.js +62 -11
- package/dist/utils/task-splitter.js.map +1 -1
- package/manifest.json +74 -0
- package/package.json +2 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Configuration Management System
|
|
3
|
+
* Handles secure cloud sync of user configurations
|
|
4
|
+
* Requirements: 12.3, 12.6
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Cloud config manager options
|
|
8
|
+
*/
|
|
9
|
+
export interface CloudConfigOptions {
|
|
10
|
+
encryptionKey: string;
|
|
11
|
+
syncEndpoint: string;
|
|
12
|
+
deviceName?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Encrypted configuration structure
|
|
16
|
+
*/
|
|
17
|
+
export interface EncryptedConfig {
|
|
18
|
+
data: string;
|
|
19
|
+
iv: string;
|
|
20
|
+
version: number;
|
|
21
|
+
timestamp: number;
|
|
22
|
+
deviceId?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Configuration sync status
|
|
26
|
+
*/
|
|
27
|
+
export interface ConfigSyncStatus {
|
|
28
|
+
syncState: 'idle' | 'syncing' | 'error' | 'conflict';
|
|
29
|
+
lastSyncTime: number;
|
|
30
|
+
hasPendingChanges: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
conflictInfo?: ConflictInfo;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Conflict detection result
|
|
36
|
+
*/
|
|
37
|
+
export interface ConflictInfo {
|
|
38
|
+
hasConflict: boolean;
|
|
39
|
+
newerVersion?: 'local' | 'remote';
|
|
40
|
+
localVersion?: number;
|
|
41
|
+
remoteVersion?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Conflict resolution result
|
|
45
|
+
*/
|
|
46
|
+
export interface ResolutionResult {
|
|
47
|
+
winner: 'local' | 'remote' | 'merged';
|
|
48
|
+
config?: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Known device info
|
|
52
|
+
*/
|
|
53
|
+
export interface DeviceInfo {
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
lastSeen: number;
|
|
57
|
+
platform: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cloud Configuration Manager
|
|
61
|
+
* Handles encrypted cloud sync of configurations
|
|
62
|
+
*/
|
|
63
|
+
export declare class CloudConfigManager {
|
|
64
|
+
private options;
|
|
65
|
+
private currentVersion;
|
|
66
|
+
private hasPendingChanges;
|
|
67
|
+
private lastSyncTime;
|
|
68
|
+
private deviceId;
|
|
69
|
+
private localConfig;
|
|
70
|
+
private knownDevices;
|
|
71
|
+
constructor(options: CloudConfigOptions);
|
|
72
|
+
/**
|
|
73
|
+
* Encrypt configuration for cloud storage
|
|
74
|
+
*/
|
|
75
|
+
encryptConfig(config: Record<string, unknown>): EncryptedConfig;
|
|
76
|
+
/**
|
|
77
|
+
* Decrypt configuration from cloud storage
|
|
78
|
+
*/
|
|
79
|
+
decryptConfig(encrypted: EncryptedConfig): Record<string, unknown>;
|
|
80
|
+
/**
|
|
81
|
+
* Derive encryption key from password
|
|
82
|
+
*/
|
|
83
|
+
private deriveKey;
|
|
84
|
+
/**
|
|
85
|
+
* Get current configuration version
|
|
86
|
+
*/
|
|
87
|
+
getCurrentVersion(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Save configuration locally
|
|
90
|
+
*/
|
|
91
|
+
saveLocal(config: Record<string, unknown>): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Detect conflict between local and remote configs
|
|
94
|
+
*/
|
|
95
|
+
detectConflict(local: EncryptedConfig, remote: EncryptedConfig): ConflictInfo;
|
|
96
|
+
/**
|
|
97
|
+
* Get current sync status
|
|
98
|
+
*/
|
|
99
|
+
getSyncStatus(): ConfigSyncStatus;
|
|
100
|
+
/**
|
|
101
|
+
* Get device ID
|
|
102
|
+
*/
|
|
103
|
+
getDeviceId(): string;
|
|
104
|
+
/**
|
|
105
|
+
* Generate unique device ID
|
|
106
|
+
*/
|
|
107
|
+
private generateDeviceId;
|
|
108
|
+
/**
|
|
109
|
+
* Get known devices
|
|
110
|
+
*/
|
|
111
|
+
getKnownDevices(): DeviceInfo[];
|
|
112
|
+
/**
|
|
113
|
+
* Merge two configurations
|
|
114
|
+
*/
|
|
115
|
+
mergeConfigs(local: Record<string, unknown>, remote: Record<string, unknown>): Record<string, unknown>;
|
|
116
|
+
/**
|
|
117
|
+
* Deep merge objects
|
|
118
|
+
*/
|
|
119
|
+
private deepMerge;
|
|
120
|
+
/**
|
|
121
|
+
* Resolve conflict between local and remote
|
|
122
|
+
*/
|
|
123
|
+
resolveConflict(local: {
|
|
124
|
+
version: number;
|
|
125
|
+
timestamp: number;
|
|
126
|
+
}, remote: {
|
|
127
|
+
version: number;
|
|
128
|
+
timestamp: number;
|
|
129
|
+
}, strategy: 'keep-newer' | 'keep-local' | 'keep-remote' | 'merge'): ResolutionResult;
|
|
130
|
+
/**
|
|
131
|
+
* Sync configuration to cloud
|
|
132
|
+
*/
|
|
133
|
+
syncToCloud(): Promise<ConfigSyncStatus>;
|
|
134
|
+
/**
|
|
135
|
+
* Sync configuration from cloud
|
|
136
|
+
*/
|
|
137
|
+
syncFromCloud(): Promise<Record<string, unknown> | null>;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=cloud-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/remote/cloud-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Configuration Management System
|
|
3
|
+
* Handles secure cloud sync of user configurations
|
|
4
|
+
* Requirements: 12.3, 12.6
|
|
5
|
+
*/
|
|
6
|
+
import { createCipheriv, createDecipheriv, randomBytes, createHash } from 'crypto';
|
|
7
|
+
/**
|
|
8
|
+
* Cloud Configuration Manager
|
|
9
|
+
* Handles encrypted cloud sync of configurations
|
|
10
|
+
*/
|
|
11
|
+
export class CloudConfigManager {
|
|
12
|
+
options;
|
|
13
|
+
currentVersion = 0;
|
|
14
|
+
hasPendingChanges = false;
|
|
15
|
+
lastSyncTime = 0;
|
|
16
|
+
deviceId;
|
|
17
|
+
localConfig = null;
|
|
18
|
+
knownDevices = [];
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this.deviceId = this.generateDeviceId();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Encrypt configuration for cloud storage
|
|
25
|
+
*/
|
|
26
|
+
encryptConfig(config) {
|
|
27
|
+
const iv = randomBytes(16);
|
|
28
|
+
const key = this.deriveKey(this.options.encryptionKey);
|
|
29
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
30
|
+
const jsonData = JSON.stringify(config);
|
|
31
|
+
let encrypted = cipher.update(jsonData, 'utf8', 'base64');
|
|
32
|
+
encrypted += cipher.final('base64');
|
|
33
|
+
const authTag = cipher.getAuthTag();
|
|
34
|
+
return {
|
|
35
|
+
data: encrypted + ':' + authTag.toString('base64'),
|
|
36
|
+
iv: iv.toString('base64'),
|
|
37
|
+
version: this.currentVersion + 1,
|
|
38
|
+
timestamp: Date.now(),
|
|
39
|
+
deviceId: this.deviceId,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Decrypt configuration from cloud storage
|
|
44
|
+
*/
|
|
45
|
+
decryptConfig(encrypted) {
|
|
46
|
+
const [encryptedData, authTagBase64] = encrypted.data.split(':');
|
|
47
|
+
const iv = Buffer.from(encrypted.iv, 'base64');
|
|
48
|
+
const key = this.deriveKey(this.options.encryptionKey);
|
|
49
|
+
const authTag = Buffer.from(authTagBase64, 'base64');
|
|
50
|
+
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
51
|
+
decipher.setAuthTag(authTag);
|
|
52
|
+
let decrypted = decipher.update(encryptedData, 'base64', 'utf8');
|
|
53
|
+
decrypted += decipher.final('utf8');
|
|
54
|
+
return JSON.parse(decrypted);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Derive encryption key from password
|
|
58
|
+
*/
|
|
59
|
+
deriveKey(password) {
|
|
60
|
+
const hash = createHash('sha256');
|
|
61
|
+
hash.update(password);
|
|
62
|
+
return hash.digest();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get current configuration version
|
|
66
|
+
*/
|
|
67
|
+
getCurrentVersion() {
|
|
68
|
+
return this.currentVersion;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Save configuration locally
|
|
72
|
+
*/
|
|
73
|
+
async saveLocal(config) {
|
|
74
|
+
this.localConfig = config;
|
|
75
|
+
this.currentVersion++;
|
|
76
|
+
this.hasPendingChanges = true;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Detect conflict between local and remote configs
|
|
80
|
+
*/
|
|
81
|
+
detectConflict(local, remote) {
|
|
82
|
+
if (local.version === remote.version) {
|
|
83
|
+
return {
|
|
84
|
+
hasConflict: false,
|
|
85
|
+
localVersion: local.version,
|
|
86
|
+
remoteVersion: remote.version,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const hasConflict = local.version !== remote.version;
|
|
90
|
+
const newerVersion = local.version > remote.version ? 'local' : 'remote';
|
|
91
|
+
return {
|
|
92
|
+
hasConflict,
|
|
93
|
+
newerVersion,
|
|
94
|
+
localVersion: local.version,
|
|
95
|
+
remoteVersion: remote.version,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get current sync status
|
|
100
|
+
*/
|
|
101
|
+
getSyncStatus() {
|
|
102
|
+
return {
|
|
103
|
+
syncState: 'idle',
|
|
104
|
+
lastSyncTime: this.lastSyncTime,
|
|
105
|
+
hasPendingChanges: this.hasPendingChanges,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get device ID
|
|
110
|
+
*/
|
|
111
|
+
getDeviceId() {
|
|
112
|
+
return this.deviceId;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate unique device ID
|
|
116
|
+
*/
|
|
117
|
+
generateDeviceId() {
|
|
118
|
+
// In real implementation, this would be persisted
|
|
119
|
+
const hash = createHash('sha256');
|
|
120
|
+
hash.update(this.options.deviceName || 'default');
|
|
121
|
+
hash.update(Date.now().toString());
|
|
122
|
+
hash.update(randomBytes(16));
|
|
123
|
+
return hash.digest('hex').substring(0, 16);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get known devices
|
|
127
|
+
*/
|
|
128
|
+
getKnownDevices() {
|
|
129
|
+
return this.knownDevices;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Merge two configurations
|
|
133
|
+
*/
|
|
134
|
+
mergeConfigs(local, remote) {
|
|
135
|
+
// Deep merge with remote taking precedence for conflicts
|
|
136
|
+
return this.deepMerge(local, remote);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Deep merge objects
|
|
140
|
+
*/
|
|
141
|
+
deepMerge(target, source) {
|
|
142
|
+
const result = { ...target };
|
|
143
|
+
for (const key of Object.keys(source)) {
|
|
144
|
+
if (source[key] !== null &&
|
|
145
|
+
typeof source[key] === 'object' &&
|
|
146
|
+
!Array.isArray(source[key]) &&
|
|
147
|
+
target[key] !== null &&
|
|
148
|
+
typeof target[key] === 'object' &&
|
|
149
|
+
!Array.isArray(target[key])) {
|
|
150
|
+
result[key] = this.deepMerge(target[key], source[key]);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
result[key] = source[key];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve conflict between local and remote
|
|
160
|
+
*/
|
|
161
|
+
resolveConflict(local, remote, strategy) {
|
|
162
|
+
switch (strategy) {
|
|
163
|
+
case 'keep-local':
|
|
164
|
+
return { winner: 'local' };
|
|
165
|
+
case 'keep-remote':
|
|
166
|
+
return { winner: 'remote' };
|
|
167
|
+
case 'keep-newer':
|
|
168
|
+
if (local.timestamp > remote.timestamp || local.version > remote.version) {
|
|
169
|
+
return { winner: 'local' };
|
|
170
|
+
}
|
|
171
|
+
return { winner: 'remote' };
|
|
172
|
+
case 'merge':
|
|
173
|
+
return { winner: 'merged' };
|
|
174
|
+
default:
|
|
175
|
+
return { winner: 'local' };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Sync configuration to cloud
|
|
180
|
+
*/
|
|
181
|
+
async syncToCloud() {
|
|
182
|
+
if (!this.localConfig) {
|
|
183
|
+
return this.getSyncStatus();
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
// Encrypt config for transmission (currently a no-op for placeholder)
|
|
187
|
+
this.encryptConfig(this.localConfig);
|
|
188
|
+
// In real implementation, this would POST to the sync endpoint
|
|
189
|
+
// const encrypted = this.encryptConfig(this.localConfig);
|
|
190
|
+
// await fetch(this.options.syncEndpoint, {
|
|
191
|
+
// method: 'POST',
|
|
192
|
+
// body: JSON.stringify(encrypted),
|
|
193
|
+
// });
|
|
194
|
+
this.lastSyncTime = Date.now();
|
|
195
|
+
this.hasPendingChanges = false;
|
|
196
|
+
return {
|
|
197
|
+
syncState: 'idle',
|
|
198
|
+
lastSyncTime: this.lastSyncTime,
|
|
199
|
+
hasPendingChanges: false,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return {
|
|
204
|
+
syncState: 'error',
|
|
205
|
+
lastSyncTime: this.lastSyncTime,
|
|
206
|
+
hasPendingChanges: true,
|
|
207
|
+
error: error.message,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Sync configuration from cloud
|
|
213
|
+
*/
|
|
214
|
+
async syncFromCloud() {
|
|
215
|
+
try {
|
|
216
|
+
// In real implementation, this would GET from the sync endpoint
|
|
217
|
+
// const response = await fetch(this.options.syncEndpoint);
|
|
218
|
+
// const encrypted = await response.json();
|
|
219
|
+
// return this.decryptConfig(encrypted);
|
|
220
|
+
this.lastSyncTime = Date.now();
|
|
221
|
+
return this.localConfig;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error('Failed to sync from cloud:', error);
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=cloud-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-config.js","sourceRoot":"","sources":["../../src/remote/cloud-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Integration System
|
|
3
|
+
* Coordinates Remote MCP and Native integrations across platforms
|
|
4
|
+
* Requirement: 12.5
|
|
5
|
+
*/
|
|
6
|
+
export type Platform = 'macos' | 'ios' | 'ipados' | 'web' | 'unknown';
|
|
7
|
+
export type IntegrationType = 'native' | 'remote' | 'mcp' | 'unavailable';
|
|
8
|
+
export type ServiceType = 'reminders' | 'calendar' | 'notion';
|
|
9
|
+
/**
|
|
10
|
+
* Platform capabilities for each service
|
|
11
|
+
*/
|
|
12
|
+
export interface PlatformCapabilities {
|
|
13
|
+
reminders: IntegrationType;
|
|
14
|
+
calendar: IntegrationType;
|
|
15
|
+
notion: IntegrationType;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Integration strategy for a service
|
|
19
|
+
*/
|
|
20
|
+
export interface IntegrationStrategy {
|
|
21
|
+
primary: IntegrationType;
|
|
22
|
+
fallback?: IntegrationType;
|
|
23
|
+
options?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Task execution request
|
|
27
|
+
*/
|
|
28
|
+
export interface TaskExecutionRequest {
|
|
29
|
+
type: string;
|
|
30
|
+
platform: Platform;
|
|
31
|
+
payload: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Task execution result
|
|
35
|
+
*/
|
|
36
|
+
export interface TaskExecutionResult {
|
|
37
|
+
success: boolean;
|
|
38
|
+
attempted: IntegrationType[];
|
|
39
|
+
result?: unknown;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Platform coordination plan
|
|
44
|
+
*/
|
|
45
|
+
export interface CoordinationPlan {
|
|
46
|
+
platforms: Platform[];
|
|
47
|
+
syncStrategy: 'real-time' | 'eventual' | 'manual';
|
|
48
|
+
conflictResolution: 'last-write-wins' | 'merge' | 'manual';
|
|
49
|
+
syncInterval?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Integration Capability class
|
|
53
|
+
* Represents a capability with priority
|
|
54
|
+
*/
|
|
55
|
+
export declare class IntegrationCapability {
|
|
56
|
+
readonly type: IntegrationType;
|
|
57
|
+
readonly service: ServiceType;
|
|
58
|
+
readonly priority: number;
|
|
59
|
+
constructor(type: IntegrationType, service: ServiceType, priority: number);
|
|
60
|
+
/**
|
|
61
|
+
* Check if this capability is preferred over another
|
|
62
|
+
*/
|
|
63
|
+
isPreferredOver(other: IntegrationCapability): boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Hybrid Integration Manager
|
|
67
|
+
* Coordinates between native and remote integrations
|
|
68
|
+
*/
|
|
69
|
+
export declare class HybridIntegrationManager {
|
|
70
|
+
private capabilityMap;
|
|
71
|
+
constructor();
|
|
72
|
+
/**
|
|
73
|
+
* Initialize capability map for all platforms
|
|
74
|
+
*/
|
|
75
|
+
private initializeCapabilityMap;
|
|
76
|
+
/**
|
|
77
|
+
* Detect available capabilities for a platform
|
|
78
|
+
*/
|
|
79
|
+
detectCapabilities(platform: Platform): PlatformCapabilities;
|
|
80
|
+
/**
|
|
81
|
+
* Select the best integration strategy for a service on a platform
|
|
82
|
+
*/
|
|
83
|
+
selectStrategy(service: ServiceType, platform: Platform): IntegrationStrategy;
|
|
84
|
+
/**
|
|
85
|
+
* Execute a task using the hybrid integration system
|
|
86
|
+
*/
|
|
87
|
+
executeTask(request: TaskExecutionRequest): Promise<TaskExecutionResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Plan coordination between multiple platforms
|
|
90
|
+
*/
|
|
91
|
+
planCoordination(platforms: Platform[]): CoordinationPlan;
|
|
92
|
+
/**
|
|
93
|
+
* Get service type from task type
|
|
94
|
+
*/
|
|
95
|
+
private getServiceFromTaskType;
|
|
96
|
+
/**
|
|
97
|
+
* Execute task using native integration
|
|
98
|
+
*/
|
|
99
|
+
private executeNative;
|
|
100
|
+
/**
|
|
101
|
+
* Execute task using remote MCP server
|
|
102
|
+
*/
|
|
103
|
+
private executeRemote;
|
|
104
|
+
/**
|
|
105
|
+
* Execute task using MCP client
|
|
106
|
+
*/
|
|
107
|
+
private executeMCP;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=hybrid-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-integration.d.ts","sourceRoot":"","sources":["../../src/remote/hybrid-integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,aAAa,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,YAAY,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IAClD,kBAAkB,EAAE,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;aAEd,IAAI,EAAE,eAAe;aACrB,OAAO,EAAE,WAAW;aACpB,QAAQ,EAAE,MAAM;gBAFhB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM;IAGlC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;CAGvD;AAED;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,aAAa,CAAsC;;IAM3D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyC/B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,oBAAoB;IAU5D;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,mBAAmB;IAmB7E;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsD9E;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,gBAAgB;IAsBzD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;YACW,aAAa;IAa3B;;OAEG;YACW,aAAa;IAY3B;;OAEG;YACW,UAAU;CAWzB"}
|