@zengxingyuan/aamp-cli-bridge 0.1.7-dev.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 +326 -0
- package/dist/agent-bridge.d.ts +42 -0
- package/dist/agent-bridge.js +709 -0
- package/dist/agent-bridge.js.map +1 -0
- package/dist/bridge.d.ts +12 -0
- package/dist/bridge.js +58 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli/init.d.ts +9 -0
- package/dist/cli/init.js +656 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/profile-maker.d.ts +1 -0
- package/dist/cli/profile-maker.js +136 -0
- package/dist/cli/profile-maker.js.map +1 -0
- package/dist/cli-agent-client.d.ts +21 -0
- package/dist/cli-agent-client.js +150 -0
- package/dist/cli-agent-client.js.map +1 -0
- package/dist/cli-profiles.d.ts +10 -0
- package/dist/cli-profiles.js +97 -0
- package/dist/cli-profiles.js.map +1 -0
- package/dist/config.d.ts +639 -0
- package/dist/config.js +95 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +256 -0
- package/dist/index.js.map +1 -0
- package/dist/pairing.d.ts +39 -0
- package/dist/pairing.js +110 -0
- package/dist/pairing.js.map +1 -0
- package/dist/prompt-builder.d.ts +15 -0
- package/dist/prompt-builder.js +388 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/storage.d.ts +7 -0
- package/dist/storage.js +65 -0
- package/dist/storage.js.map +1 -0
- package/dist/stream-parser.d.ts +26 -0
- package/dist/stream-parser.js +155 -0
- package/dist/stream-parser.js.map +1 -0
- package/package.json +32 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const cliProfileDefinitionSchema = z.object({
|
|
4
|
+
name: z.string().min(1).optional(),
|
|
5
|
+
description: z.string().optional(),
|
|
6
|
+
command: z.string().min(1),
|
|
7
|
+
args: z.array(z.string()).optional(),
|
|
8
|
+
stdin: z.string().optional(),
|
|
9
|
+
env: z.record(z.string()).optional(),
|
|
10
|
+
cwd: z.string().optional(),
|
|
11
|
+
shell: z.boolean().optional(),
|
|
12
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
13
|
+
successExitCodes: z.array(z.number().int()).optional(),
|
|
14
|
+
stream: z.object({
|
|
15
|
+
format: z.enum(['sse', 'ndjson']),
|
|
16
|
+
enabled: z.boolean().optional(),
|
|
17
|
+
}).optional(),
|
|
18
|
+
output: z.object({
|
|
19
|
+
includeStderr: z.boolean().optional(),
|
|
20
|
+
stripAnsi: z.boolean().optional(),
|
|
21
|
+
trim: z.boolean().optional(),
|
|
22
|
+
}).optional(),
|
|
23
|
+
});
|
|
24
|
+
const senderPolicySchema = z.object({
|
|
25
|
+
sender: z.string().email(),
|
|
26
|
+
dispatchContextRules: z.record(z.array(z.string().min(1))).optional(),
|
|
27
|
+
});
|
|
28
|
+
const agentConfigSchema = z.object({
|
|
29
|
+
name: z.string().min(1),
|
|
30
|
+
cliProfile: z.union([z.string().min(1), cliProfileDefinitionSchema]),
|
|
31
|
+
slug: z.string().regex(/^[a-z0-9-]+$/).optional(),
|
|
32
|
+
description: z.string().optional(),
|
|
33
|
+
summary: z.string().optional(),
|
|
34
|
+
cardText: z.string().optional(),
|
|
35
|
+
cardFile: z.string().optional(),
|
|
36
|
+
credentialsFile: z.string().optional(),
|
|
37
|
+
pairingFile: z.string().optional(),
|
|
38
|
+
senderPoliciesFile: z.string().optional(),
|
|
39
|
+
senderWhitelist: z.array(z.string().email()).optional(),
|
|
40
|
+
senderPolicies: z.array(senderPolicySchema).optional(),
|
|
41
|
+
taskDispatchConcurrency: z.number().int().positive().optional(),
|
|
42
|
+
});
|
|
43
|
+
const bridgeConfigSchema = z.object({
|
|
44
|
+
aampHost: z.string().url(),
|
|
45
|
+
rejectUnauthorized: z.boolean().default(false),
|
|
46
|
+
profiles: z.record(cliProfileDefinitionSchema).optional(),
|
|
47
|
+
agents: z.array(agentConfigSchema).min(1),
|
|
48
|
+
});
|
|
49
|
+
function normalizeSenderPolicies(senderPolicies, senderWhitelist) {
|
|
50
|
+
const sourcePolicies = senderPolicies?.length
|
|
51
|
+
? senderPolicies
|
|
52
|
+
: senderWhitelist?.length
|
|
53
|
+
? senderWhitelist.map((sender) => ({ sender }))
|
|
54
|
+
: undefined;
|
|
55
|
+
if (!sourcePolicies?.length)
|
|
56
|
+
return undefined;
|
|
57
|
+
const normalized = sourcePolicies
|
|
58
|
+
.map((policy) => {
|
|
59
|
+
let dispatchContextRules;
|
|
60
|
+
if (policy.dispatchContextRules) {
|
|
61
|
+
dispatchContextRules = Object.fromEntries(Object.entries(policy.dispatchContextRules)
|
|
62
|
+
.map(([key, values]) => [
|
|
63
|
+
key.trim().toLowerCase(),
|
|
64
|
+
values.map((value) => value.trim()).filter(Boolean),
|
|
65
|
+
])
|
|
66
|
+
.filter(([key, values]) => Boolean(key) && values.length > 0));
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
sender: policy.sender.trim().toLowerCase(),
|
|
70
|
+
...(dispatchContextRules && Object.keys(dispatchContextRules).length > 0
|
|
71
|
+
? { dispatchContextRules }
|
|
72
|
+
: {}),
|
|
73
|
+
};
|
|
74
|
+
})
|
|
75
|
+
.filter((policy) => Boolean(policy.sender));
|
|
76
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
77
|
+
}
|
|
78
|
+
function normalizeAgentConfig(agent) {
|
|
79
|
+
return {
|
|
80
|
+
...agent,
|
|
81
|
+
senderPolicies: normalizeSenderPolicies(agent.senderPolicies, agent.senderWhitelist),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function loadConfig(path) {
|
|
85
|
+
if (!existsSync(path)) {
|
|
86
|
+
throw new Error(`Config file not found: ${path}. Run 'aamp-cli-bridge init' first.`);
|
|
87
|
+
}
|
|
88
|
+
const raw = JSON.parse(readFileSync(path, 'utf-8'));
|
|
89
|
+
const parsed = bridgeConfigSchema.parse(raw);
|
|
90
|
+
return {
|
|
91
|
+
...parsed,
|
|
92
|
+
agents: parsed.agents.map(normalizeAgentConfig),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { AampClient } from 'aamp-sdk';
|
|
4
|
+
import { AampCliBridge } from './bridge.js';
|
|
5
|
+
import { BUILTIN_CLI_PROFILES, getBuiltinCliProfileNames } from './cli-profiles.js';
|
|
6
|
+
import { renderPairingCode, runInit } from './cli/init.js';
|
|
7
|
+
import { runProfileMaker } from './cli/profile-maker.js';
|
|
8
|
+
import { loadConfig } from './config.js';
|
|
9
|
+
import { resolvePairingFile } from './pairing.js';
|
|
10
|
+
import { getDefaultProfilesDir, resolveConfigPath, resolveCredentialsFile } from './storage.js';
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0] ?? 'start';
|
|
13
|
+
const configPath = resolveConfigPath(args.includes('--config') ? (args[args.indexOf('--config') + 1] ?? '') : undefined);
|
|
14
|
+
function getOptionValue(flag) {
|
|
15
|
+
const idx = args.indexOf(flag);
|
|
16
|
+
return idx >= 0 ? args[idx + 1] : undefined;
|
|
17
|
+
}
|
|
18
|
+
function getAgent(config, agentName) {
|
|
19
|
+
const agent = config.agents.find((item) => item.name === agentName);
|
|
20
|
+
if (!agent) {
|
|
21
|
+
throw new Error(`Agent "${agentName}" not found in config`);
|
|
22
|
+
}
|
|
23
|
+
return agent;
|
|
24
|
+
}
|
|
25
|
+
function getConnectionSetupOption() {
|
|
26
|
+
const value = getOptionValue('--connection-setup');
|
|
27
|
+
if (!value)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (value === 'pairing-code'
|
|
30
|
+
|| value === 'manual-sender-policy'
|
|
31
|
+
|| value === 'reuse-sender-policy'
|
|
32
|
+
|| value === 'later') {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
throw new Error('--connection-setup must be one of pairing-code, manual-sender-policy, reuse-sender-policy, later');
|
|
36
|
+
}
|
|
37
|
+
function loadAgentCredentials(agent) {
|
|
38
|
+
const credFile = resolveCredentialsFile(agent.credentialsFile, agent.name);
|
|
39
|
+
const creds = JSON.parse(readFileSync(credFile, 'utf-8'));
|
|
40
|
+
if (!creds.email || !creds.smtpPassword) {
|
|
41
|
+
throw new Error(`Credentials file is incomplete: ${credFile}`);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
email: creds.email,
|
|
45
|
+
smtpPassword: creds.smtpPassword,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function createDirectoryClient(configPathValue, agentName) {
|
|
49
|
+
const config = loadConfig(configPathValue);
|
|
50
|
+
const agent = config.agents.find((item) => item.name === agentName);
|
|
51
|
+
if (!agent) {
|
|
52
|
+
throw new Error(`Agent "${agentName}" not found in ${configPathValue}`);
|
|
53
|
+
}
|
|
54
|
+
const creds = loadAgentCredentials(agent);
|
|
55
|
+
return AampClient.fromMailboxIdentity({
|
|
56
|
+
email: creds.email,
|
|
57
|
+
smtpPassword: creds.smtpPassword,
|
|
58
|
+
baseUrl: config.aampHost,
|
|
59
|
+
rejectUnauthorized: config.rejectUnauthorized,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function renderPairingForAgent(configPathValue, agentName) {
|
|
63
|
+
const config = loadConfig(configPathValue);
|
|
64
|
+
const agent = getAgent(config, agentName);
|
|
65
|
+
const creds = loadAgentCredentials(agent);
|
|
66
|
+
renderPairingCode(agent.name, creds.email, resolvePairingFile(agent.pairingFile, agent.name));
|
|
67
|
+
}
|
|
68
|
+
async function startBridge(configPathValue, options = {}) {
|
|
69
|
+
const config = loadConfig(configPathValue);
|
|
70
|
+
const agents = options.agent ? [getAgent(config, options.agent)] : config.agents;
|
|
71
|
+
const bridge = new AampCliBridge({
|
|
72
|
+
...config,
|
|
73
|
+
agents,
|
|
74
|
+
});
|
|
75
|
+
const shutdown = () => {
|
|
76
|
+
console.log('\nShutting down...');
|
|
77
|
+
bridge.stop();
|
|
78
|
+
process.exit(0);
|
|
79
|
+
};
|
|
80
|
+
process.on('SIGTERM', shutdown);
|
|
81
|
+
process.on('SIGINT', shutdown);
|
|
82
|
+
await bridge.start({ quiet: options.quiet });
|
|
83
|
+
setInterval(() => { }, 60_000);
|
|
84
|
+
}
|
|
85
|
+
async function main() {
|
|
86
|
+
switch (command) {
|
|
87
|
+
case 'init': {
|
|
88
|
+
const initialized = await runInit(configPath, {
|
|
89
|
+
agent: getOptionValue('--agent'),
|
|
90
|
+
aampHost: getOptionValue('--aamp-host'),
|
|
91
|
+
connectionSetup: getConnectionSetupOption(),
|
|
92
|
+
});
|
|
93
|
+
if (!initialized)
|
|
94
|
+
break;
|
|
95
|
+
if (args.includes('--no-start')) {
|
|
96
|
+
console.log(`CLI bridge not started because --no-start was provided.`);
|
|
97
|
+
console.log(`Run: npx aamp-cli-bridge start\n`);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
await startBridge(configPath, { quiet: true, agent: getOptionValue('--agent') });
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'start': {
|
|
104
|
+
await startBridge(configPath);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case 'pair': {
|
|
108
|
+
const agentName = getOptionValue('--agent');
|
|
109
|
+
if (!agentName)
|
|
110
|
+
throw new Error('Missing required --agent');
|
|
111
|
+
renderPairingForAgent(configPath, agentName);
|
|
112
|
+
if (args.includes('--no-start'))
|
|
113
|
+
break;
|
|
114
|
+
await startBridge(configPath, { quiet: true, agent: agentName });
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'list': {
|
|
118
|
+
const config = loadConfig(configPath);
|
|
119
|
+
console.log(`\nConfigured CLI agents (${config.agents.length}):`);
|
|
120
|
+
for (const agent of config.agents) {
|
|
121
|
+
const credFile = resolveCredentialsFile(agent.credentialsFile, agent.name);
|
|
122
|
+
let email = '(not registered)';
|
|
123
|
+
try {
|
|
124
|
+
const creds = JSON.parse(readFileSync(credFile, 'utf-8'));
|
|
125
|
+
email = creds.email ?? email;
|
|
126
|
+
}
|
|
127
|
+
catch { /* no credentials yet */ }
|
|
128
|
+
const profile = typeof agent.cliProfile === 'string'
|
|
129
|
+
? agent.cliProfile
|
|
130
|
+
: (agent.cliProfile.name ?? 'inline');
|
|
131
|
+
console.log(` ${agent.name}: ${email} (profile:${profile})`);
|
|
132
|
+
}
|
|
133
|
+
console.log();
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case 'status': {
|
|
137
|
+
const config = loadConfig(configPath);
|
|
138
|
+
const bridge = new AampCliBridge(config);
|
|
139
|
+
await bridge.start();
|
|
140
|
+
bridge.list();
|
|
141
|
+
bridge.stop();
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case 'profile-list': {
|
|
145
|
+
console.log('\nBuilt-in CLI profiles:');
|
|
146
|
+
for (const name of getBuiltinCliProfileNames()) {
|
|
147
|
+
const profile = BUILTIN_CLI_PROFILES[name];
|
|
148
|
+
console.log(` ${name}: ${profile.description ?? profile.command}`);
|
|
149
|
+
}
|
|
150
|
+
const profilesDir = getDefaultProfilesDir();
|
|
151
|
+
console.log(`\nUser CLI profiles (${profilesDir}):`);
|
|
152
|
+
if (!existsSync(profilesDir)) {
|
|
153
|
+
console.log(' (none)');
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const names = readdirSync(profilesDir)
|
|
157
|
+
.filter((item) => item.endsWith('.json'))
|
|
158
|
+
.map((item) => item.replace(/\.json$/, ''))
|
|
159
|
+
.sort();
|
|
160
|
+
if (names.length === 0) {
|
|
161
|
+
console.log(' (none)');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
for (const name of names)
|
|
165
|
+
console.log(` ${name}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
console.log();
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case 'profile-maker': {
|
|
172
|
+
await runProfileMaker();
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case 'directory-list': {
|
|
176
|
+
const agentName = getOptionValue('--agent');
|
|
177
|
+
if (!agentName)
|
|
178
|
+
throw new Error('Missing required --agent');
|
|
179
|
+
const client = createDirectoryClient(configPath, agentName);
|
|
180
|
+
const agents = await client.listDirectory({
|
|
181
|
+
includeSelf: args.includes('--include-self'),
|
|
182
|
+
limit: getOptionValue('--limit') ? Number(getOptionValue('--limit')) : undefined,
|
|
183
|
+
});
|
|
184
|
+
console.log(JSON.stringify({ agents }, null, 2));
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case 'directory-search': {
|
|
188
|
+
const agentName = getOptionValue('--agent');
|
|
189
|
+
const query = getOptionValue('--query');
|
|
190
|
+
if (!agentName)
|
|
191
|
+
throw new Error('Missing required --agent');
|
|
192
|
+
if (!query)
|
|
193
|
+
throw new Error('Missing required --query');
|
|
194
|
+
const client = createDirectoryClient(configPath, agentName);
|
|
195
|
+
const agents = await client.searchDirectory({
|
|
196
|
+
query,
|
|
197
|
+
includeSelf: args.includes('--include-self'),
|
|
198
|
+
limit: getOptionValue('--limit') ? Number(getOptionValue('--limit')) : undefined,
|
|
199
|
+
});
|
|
200
|
+
console.log(JSON.stringify({ agents }, null, 2));
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
case 'directory-update': {
|
|
204
|
+
const agentName = getOptionValue('--agent');
|
|
205
|
+
if (!agentName)
|
|
206
|
+
throw new Error('Missing required --agent');
|
|
207
|
+
const summary = getOptionValue('--summary');
|
|
208
|
+
const cardText = getOptionValue('--card-text');
|
|
209
|
+
const cardFile = getOptionValue('--card-file');
|
|
210
|
+
const resolvedCardText = cardText ?? (cardFile ? readFileSync(cardFile, 'utf-8') : undefined);
|
|
211
|
+
if (!summary && !resolvedCardText) {
|
|
212
|
+
throw new Error('Provide at least one of --summary, --card-text, or --card-file');
|
|
213
|
+
}
|
|
214
|
+
const client = createDirectoryClient(configPath, agentName);
|
|
215
|
+
const profile = await client.updateDirectoryProfile({
|
|
216
|
+
...(summary ? { summary } : {}),
|
|
217
|
+
...(resolvedCardText ? { cardText: resolvedCardText } : {}),
|
|
218
|
+
});
|
|
219
|
+
console.log(JSON.stringify({ profile }, null, 2));
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'help':
|
|
223
|
+
default:
|
|
224
|
+
console.log(`
|
|
225
|
+
AAMP CLI Bridge -- Connect direct CLI agents to the AAMP email network
|
|
226
|
+
|
|
227
|
+
Usage:
|
|
228
|
+
aamp-cli-bridge init [--agent NAME] [--aamp-host URL] [--connection-setup METHOD] [--no-start] Setup wizard, then start bridge
|
|
229
|
+
aamp-cli-bridge start [--config X] Start the bridge (default: ~/.aamp/cli-bridge/config.json)
|
|
230
|
+
aamp-cli-bridge pair --agent NAME [--config X] [--no-start] Show a pairing QR code, then start that agent
|
|
231
|
+
aamp-cli-bridge list [--config X] List configured agents
|
|
232
|
+
aamp-cli-bridge status Show live connection status
|
|
233
|
+
aamp-cli-bridge profile-list List built-in and user CLI profiles
|
|
234
|
+
aamp-cli-bridge profile-maker Interactive profile maker for custom CLI agents
|
|
235
|
+
aamp-cli-bridge directory-list --agent NAME [--config X] [--include-self] [--limit N]
|
|
236
|
+
aamp-cli-bridge directory-search --agent NAME --query TEXT [--config X] [--include-self] [--limit N]
|
|
237
|
+
aamp-cli-bridge directory-update --agent NAME [--config X] [--summary TEXT] [--card-text TEXT] [--card-file PATH]
|
|
238
|
+
aamp-cli-bridge help Show this help
|
|
239
|
+
|
|
240
|
+
Examples:
|
|
241
|
+
npx aamp-cli-bridge profile-maker
|
|
242
|
+
npx aamp-cli-bridge init
|
|
243
|
+
npx aamp-cli-bridge init --agent codem --aamp-host https://meshmail.ai --connection-setup pairing-code
|
|
244
|
+
npx aamp-cli-bridge init --no-start
|
|
245
|
+
npx aamp-cli-bridge pair --agent codex
|
|
246
|
+
npx aamp-cli-bridge start
|
|
247
|
+
npx aamp-cli-bridge start --config production.json
|
|
248
|
+
`);
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
main().catch((err) => {
|
|
253
|
+
console.error(`Error: ${err.message}`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface DispatchContextRules {
|
|
2
|
+
[key: string]: string[];
|
|
3
|
+
}
|
|
4
|
+
export interface SenderPolicy {
|
|
5
|
+
sender: string;
|
|
6
|
+
dispatchContextRules: DispatchContextRules;
|
|
7
|
+
pairedAt: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PairingCodeState {
|
|
10
|
+
mailbox: string;
|
|
11
|
+
pairCode: string;
|
|
12
|
+
expiresAt: string;
|
|
13
|
+
connectUrl: string;
|
|
14
|
+
consumedAt?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_PAIRING_WEB_URL = "https://meshmail.ai/pair";
|
|
17
|
+
export declare function defaultPairingFile(name: string): string;
|
|
18
|
+
export declare function defaultSenderPoliciesFile(name: string): string;
|
|
19
|
+
export declare function resolvePairingFile(pathValue: string | undefined, name: string): string;
|
|
20
|
+
export declare function resolveSenderPoliciesFile(pathValue: string | undefined, name: string): string;
|
|
21
|
+
export declare function createPairingCode(params: {
|
|
22
|
+
mailbox: string;
|
|
23
|
+
file: string;
|
|
24
|
+
ttlSeconds?: number;
|
|
25
|
+
}): PairingCodeState;
|
|
26
|
+
export declare function pairingUrlToWebUrl(connectUrl: string): string;
|
|
27
|
+
export declare function consumePairingCode(params: {
|
|
28
|
+
file: string;
|
|
29
|
+
mailbox: string;
|
|
30
|
+
pairCode: string;
|
|
31
|
+
}): PairingCodeState | null;
|
|
32
|
+
export declare function validatePairingCode(params: {
|
|
33
|
+
file: string;
|
|
34
|
+
mailbox: string;
|
|
35
|
+
pairCode: string;
|
|
36
|
+
}): PairingCodeState | null;
|
|
37
|
+
export declare function loadSenderPolicies(file: string): SenderPolicy[];
|
|
38
|
+
export declare function addSenderPolicy(file: string, policy: SenderPolicy): SenderPolicy[];
|
|
39
|
+
export declare function rulesMatch(rules: DispatchContextRules, dispatchContext?: Record<string, string>): boolean;
|
package/dist/pairing.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { getBridgeHomeDir } from './storage.js';
|
|
6
|
+
export const DEFAULT_PAIRING_WEB_URL = 'https://meshmail.ai/pair';
|
|
7
|
+
function expandHome(pathValue) {
|
|
8
|
+
if (pathValue === '~')
|
|
9
|
+
return homedir();
|
|
10
|
+
if (pathValue.startsWith('~/'))
|
|
11
|
+
return join(homedir(), pathValue.slice(2));
|
|
12
|
+
return pathValue;
|
|
13
|
+
}
|
|
14
|
+
export function defaultPairingFile(name) {
|
|
15
|
+
return join(getBridgeHomeDir(), 'pairing', `${name}.json`);
|
|
16
|
+
}
|
|
17
|
+
export function defaultSenderPoliciesFile(name) {
|
|
18
|
+
return join(getBridgeHomeDir(), 'sender-policies', `${name}.json`);
|
|
19
|
+
}
|
|
20
|
+
export function resolvePairingFile(pathValue, name) {
|
|
21
|
+
return expandHome(pathValue?.trim() || defaultPairingFile(name));
|
|
22
|
+
}
|
|
23
|
+
export function resolveSenderPoliciesFile(pathValue, name) {
|
|
24
|
+
return expandHome(pathValue?.trim() || defaultSenderPoliciesFile(name));
|
|
25
|
+
}
|
|
26
|
+
export function createPairingCode(params) {
|
|
27
|
+
const mailbox = params.mailbox.trim().toLowerCase();
|
|
28
|
+
const pairCode = randomBytes(6).toString('base64url');
|
|
29
|
+
const expiresAt = new Date(Date.now() + (params.ttlSeconds ?? 300) * 1000).toISOString();
|
|
30
|
+
const connectUrl = `aamp://connect?mailbox=${encodeURIComponent(mailbox)}&pair_code=${encodeURIComponent(pairCode)}`;
|
|
31
|
+
const state = {
|
|
32
|
+
mailbox,
|
|
33
|
+
pairCode,
|
|
34
|
+
expiresAt,
|
|
35
|
+
connectUrl,
|
|
36
|
+
};
|
|
37
|
+
mkdirSync(dirname(params.file), { recursive: true });
|
|
38
|
+
writeFileSync(params.file, JSON.stringify(state, null, 2));
|
|
39
|
+
return state;
|
|
40
|
+
}
|
|
41
|
+
export function pairingUrlToWebUrl(connectUrl) {
|
|
42
|
+
const parsed = new URL(connectUrl);
|
|
43
|
+
const url = new URL(DEFAULT_PAIRING_WEB_URL);
|
|
44
|
+
for (const [key, value] of parsed.searchParams) {
|
|
45
|
+
url.searchParams.set(key, value);
|
|
46
|
+
}
|
|
47
|
+
return url.toString();
|
|
48
|
+
}
|
|
49
|
+
export function consumePairingCode(params) {
|
|
50
|
+
const state = validatePairingCode(params);
|
|
51
|
+
if (!state)
|
|
52
|
+
return null;
|
|
53
|
+
writeFileSync(params.file, JSON.stringify({ ...state, pairCode: '', consumedAt: new Date().toISOString() }, null, 2));
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
export function validatePairingCode(params) {
|
|
57
|
+
if (!existsSync(params.file))
|
|
58
|
+
return null;
|
|
59
|
+
const state = JSON.parse(readFileSync(params.file, 'utf-8'));
|
|
60
|
+
if (state.mailbox.toLowerCase() !== params.mailbox.toLowerCase())
|
|
61
|
+
return null;
|
|
62
|
+
if (state.pairCode !== params.pairCode)
|
|
63
|
+
return null;
|
|
64
|
+
if (state.consumedAt)
|
|
65
|
+
return null;
|
|
66
|
+
if (new Date(state.expiresAt).getTime() <= Date.now())
|
|
67
|
+
return null;
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
export function loadSenderPolicies(file) {
|
|
71
|
+
if (!existsSync(file))
|
|
72
|
+
return [];
|
|
73
|
+
try {
|
|
74
|
+
const data = JSON.parse(readFileSync(file, 'utf-8'));
|
|
75
|
+
return Array.isArray(data) ? data.filter(isSenderPolicy) : [];
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function addSenderPolicy(file, policy) {
|
|
82
|
+
const policies = loadSenderPolicies(file);
|
|
83
|
+
const normalizedSender = policy.sender.toLowerCase();
|
|
84
|
+
const next = [
|
|
85
|
+
...policies.filter((item) => item.sender.toLowerCase() !== normalizedSender),
|
|
86
|
+
{ ...policy, sender: normalizedSender },
|
|
87
|
+
];
|
|
88
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
89
|
+
writeFileSync(file, JSON.stringify(next, null, 2));
|
|
90
|
+
return next;
|
|
91
|
+
}
|
|
92
|
+
function isSenderPolicy(value) {
|
|
93
|
+
if (!value || typeof value !== 'object')
|
|
94
|
+
return false;
|
|
95
|
+
const policy = value;
|
|
96
|
+
return typeof policy.sender === 'string'
|
|
97
|
+
&& typeof policy.dispatchContextRules === 'object'
|
|
98
|
+
&& typeof policy.pairedAt === 'string';
|
|
99
|
+
}
|
|
100
|
+
export function rulesMatch(rules, dispatchContext) {
|
|
101
|
+
for (const [key, allowedValues] of Object.entries(rules)) {
|
|
102
|
+
if (!Array.isArray(allowedValues) || allowedValues.length === 0)
|
|
103
|
+
continue;
|
|
104
|
+
const observed = dispatchContext?.[key];
|
|
105
|
+
if (!observed || !allowedValues.includes(observed))
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=pairing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StructuredResultField, TaskDispatch } from 'aamp-sdk';
|
|
2
|
+
export interface ResultAttachmentRef {
|
|
3
|
+
path: string;
|
|
4
|
+
filename?: string;
|
|
5
|
+
contentType?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildPrompt(task: TaskDispatch, threadContextText?: string, agentName?: string): string;
|
|
8
|
+
export declare function parseResponse(output: string): {
|
|
9
|
+
isHelp: boolean;
|
|
10
|
+
question?: string;
|
|
11
|
+
output: string;
|
|
12
|
+
files: string[];
|
|
13
|
+
structuredResult?: StructuredResultField[];
|
|
14
|
+
attachments?: ResultAttachmentRef[];
|
|
15
|
+
};
|