@sente-labs/cli 0.9.0 → 0.11.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/dist/commands/identity.js +6 -3
- package/dist/commands/identity.js.map +1 -1
- package/dist/commands/inbox.js +106 -19
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/token.js +24 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/commands/webhook.js +5 -3
- package/dist/commands/webhook.js.map +1 -1
- package/dist/identityRef.js +26 -0
- package/dist/identityRef.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/skill/SKILL.md +4 -2
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerIdentityCommands = registerIdentityCommands;
|
|
4
4
|
const client_1 = require("../client");
|
|
5
|
+
const identityRef_1 = require("../identityRef");
|
|
5
6
|
const output_1 = require("../output");
|
|
6
7
|
/**
|
|
7
8
|
* `sente identity …` — manage the agent's managed email identities (AgentAccount).
|
|
@@ -59,11 +60,13 @@ function registerIdentityCommands(program, globalOpts) {
|
|
|
59
60
|
identity
|
|
60
61
|
.command('show')
|
|
61
62
|
.description('Show one identity')
|
|
62
|
-
.argument('<
|
|
63
|
-
.action(async (
|
|
63
|
+
.argument('<ref>', 'identity id, email, or local-part')
|
|
64
|
+
.action(async (ref) => {
|
|
64
65
|
const opts = globalOpts();
|
|
65
66
|
try {
|
|
66
|
-
const
|
|
67
|
+
const client = new client_1.GatewayClient();
|
|
68
|
+
const id = await (0, identityRef_1.resolveIdentityId)(client, ref);
|
|
69
|
+
const idt = await client.request(`/v1/identities/${id}`);
|
|
67
70
|
(0, output_1.printSuccess)(idt, () => process.stdout.write(`${idt.email}\n id: ${idt.id}\n name: ${idt.name ?? '-'}\n description: ${idt.description ?? '-'}\n`), opts);
|
|
68
71
|
}
|
|
69
72
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/commands/identity.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/commands/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/inbox.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerInboxCommands = registerInboxCommands;
|
|
4
4
|
const node_child_process_1 = require("node:child_process");
|
|
5
5
|
const client_1 = require("../client");
|
|
6
|
+
const identityRef_1 = require("../identityRef");
|
|
6
7
|
const output_1 = require("../output");
|
|
7
8
|
function printMessages(msgs) {
|
|
8
9
|
if (msgs.length === 0) {
|
|
@@ -14,6 +15,39 @@ function printMessages(msgs) {
|
|
|
14
15
|
process.stdout.write(`${dir} ${m.fromAddr} "${m.subject ?? '(no subject)'}" ${m.createdAt} ${m.id}\n`);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
18
|
+
const IDENTITY_HELP = 'identity id, email, or local-part';
|
|
19
|
+
/**
|
|
20
|
+
* POST a message to a local URL in the exact shape Sente's real webhook sends
|
|
21
|
+
* (`{ type: "message.received", message: {...} }` + `x-sente-secret` header), so
|
|
22
|
+
* a webhook handler can be tested locally with no public URL. The secret comes
|
|
23
|
+
* from SENTE_WEBHOOK_SECRET (the same value the handler verifies against); the
|
|
24
|
+
* header is omitted if it's unset. Like the real webhook, the body carries no
|
|
25
|
+
* mail content — the handler fetches it with `messages.get(message.id)`.
|
|
26
|
+
*/
|
|
27
|
+
async function forwardToWebhook(url, msg, identity, secret) {
|
|
28
|
+
const envelope = {
|
|
29
|
+
type: 'message.received',
|
|
30
|
+
message: {
|
|
31
|
+
id: msg.id,
|
|
32
|
+
channel: 'email',
|
|
33
|
+
identity: { id: identity.id, name: identity.name, email: identity.email },
|
|
34
|
+
from: msg.fromAddr,
|
|
35
|
+
to: msg.toAddr,
|
|
36
|
+
subject: msg.subject,
|
|
37
|
+
createdAt: msg.createdAt,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const headers = { 'content-type': 'application/json' };
|
|
41
|
+
if (secret)
|
|
42
|
+
headers['x-sente-secret'] = secret;
|
|
43
|
+
try {
|
|
44
|
+
const res = await fetch(url, { method: 'POST', headers, body: JSON.stringify(envelope) });
|
|
45
|
+
process.stderr.write(`→ ${url} ${res.status} "${msg.subject ?? '(no subject)'}"\n`);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
process.stderr.write(`(forward failed: ${err.message})\n`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
17
51
|
/**
|
|
18
52
|
* `sente inbox|wait|listen` — read and react to an identity's mail (AgentAccount).
|
|
19
53
|
* Targets the Sente API (`/v1/messages`) with the stored API key.
|
|
@@ -22,20 +56,17 @@ function registerInboxCommands(program, globalOpts) {
|
|
|
22
56
|
program
|
|
23
57
|
.command('inbox')
|
|
24
58
|
.description("List an identity's recent messages (returns immediately)")
|
|
25
|
-
.requiredOption('--identity <
|
|
59
|
+
.requiredOption('--identity <ref>', IDENTITY_HELP)
|
|
26
60
|
.option('--since <ts>', 'only messages after this ISO timestamp')
|
|
27
61
|
.option('--direction <dir>', 'inbound | outbound')
|
|
28
62
|
.option('--limit <n>', 'max messages', '50')
|
|
29
63
|
.action(async (cmdOpts) => {
|
|
30
64
|
const opts = globalOpts();
|
|
31
65
|
try {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
direction: cmdOpts.direction,
|
|
37
|
-
limit: cmdOpts.limit,
|
|
38
|
-
},
|
|
66
|
+
const client = new client_1.GatewayClient();
|
|
67
|
+
const identityId = await (0, identityRef_1.resolveIdentityId)(client, cmdOpts.identity);
|
|
68
|
+
const msgs = await client.request('/v1/messages', {
|
|
69
|
+
query: { identityId, since: cmdOpts.since, direction: cmdOpts.direction, limit: cmdOpts.limit },
|
|
39
70
|
});
|
|
40
71
|
(0, output_1.printSuccess)(msgs, () => printMessages(msgs), opts);
|
|
41
72
|
}
|
|
@@ -46,14 +77,16 @@ function registerInboxCommands(program, globalOpts) {
|
|
|
46
77
|
program
|
|
47
78
|
.command('wait')
|
|
48
79
|
.description('Block until the next message arrives for an identity (long-poll)')
|
|
49
|
-
.requiredOption('--identity <
|
|
80
|
+
.requiredOption('--identity <ref>', IDENTITY_HELP)
|
|
50
81
|
.option('--since <ts>', 'wait for messages after this ISO timestamp')
|
|
51
82
|
.option('--timeout <s>', 'seconds to wait before giving up', '25')
|
|
52
83
|
.action(async (cmdOpts) => {
|
|
53
84
|
const opts = globalOpts();
|
|
54
85
|
try {
|
|
55
|
-
const
|
|
56
|
-
|
|
86
|
+
const client = new client_1.GatewayClient();
|
|
87
|
+
const identityId = await (0, identityRef_1.resolveIdentityId)(client, cmdOpts.identity);
|
|
88
|
+
const msg = await client.request('/v1/messages/wait', {
|
|
89
|
+
query: { identityId, since: cmdOpts.since, timeout: cmdOpts.timeout },
|
|
57
90
|
});
|
|
58
91
|
if (!msg) {
|
|
59
92
|
if (!opts.json)
|
|
@@ -70,20 +103,39 @@ function registerInboxCommands(program, globalOpts) {
|
|
|
70
103
|
program
|
|
71
104
|
.command('listen')
|
|
72
105
|
.description('Stream messages as they arrive (long-poll loop). Ctrl-C to stop.')
|
|
73
|
-
.requiredOption('--identity <
|
|
106
|
+
.requiredOption('--identity <ref>', IDENTITY_HELP)
|
|
74
107
|
.option('--since <ts>', 'start after this ISO timestamp')
|
|
75
108
|
.option('--exec <cmd>', 'run this shell command per message (message JSON on stdin)')
|
|
109
|
+
.option('--forward <url>', 'POST each inbound message to this URL as a Sente webhook (local webhook testing)')
|
|
76
110
|
.action(async (cmdOpts) => {
|
|
77
|
-
const opts = globalOpts();
|
|
78
111
|
const client = new client_1.GatewayClient();
|
|
112
|
+
let identityId;
|
|
113
|
+
try {
|
|
114
|
+
identityId = await (0, identityRef_1.resolveIdentityId)(client, cmdOpts.identity);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
process.exit((0, output_1.printError)(err, globalOpts()));
|
|
118
|
+
}
|
|
119
|
+
// --forward mimics the real webhook envelope, which embeds the identity.
|
|
120
|
+
let identity;
|
|
121
|
+
if (cmdOpts.forward) {
|
|
122
|
+
try {
|
|
123
|
+
identity = await client.request(`/v1/identities/${identityId}`);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
process.exit((0, output_1.printError)(err, globalOpts()));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const secret = process.env.SENTE_WEBHOOK_SECRET;
|
|
79
130
|
let since = cmdOpts.since;
|
|
80
|
-
|
|
131
|
+
const dest = cmdOpts.forward ? ` (forwarding to ${cmdOpts.forward})` : '';
|
|
132
|
+
process.stderr.write(`Listening on ${cmdOpts.identity}${dest}… (Ctrl-C to stop)\n`);
|
|
81
133
|
// Long-poll loop. Retry transient errors rather than dying — this is a daemon.
|
|
82
134
|
for (;;) {
|
|
83
135
|
let msg;
|
|
84
136
|
try {
|
|
85
137
|
msg = await client.request('/v1/messages/wait', {
|
|
86
|
-
query: { identityId
|
|
138
|
+
query: { identityId, since, timeout: '25' },
|
|
87
139
|
});
|
|
88
140
|
}
|
|
89
141
|
catch (err) {
|
|
@@ -93,16 +145,51 @@ function registerInboxCommands(program, globalOpts) {
|
|
|
93
145
|
}
|
|
94
146
|
if (!msg)
|
|
95
147
|
continue; // timeout → re-poll
|
|
96
|
-
|
|
97
|
-
|
|
148
|
+
if (cmdOpts.forward) {
|
|
149
|
+
// Real webhooks fire on inbound only — skip the identity's own sends.
|
|
150
|
+
if (msg.direction !== 'outbound')
|
|
151
|
+
await forwardToWebhook(cmdOpts.forward, msg, identity, secret);
|
|
152
|
+
}
|
|
153
|
+
else if (cmdOpts.exec) {
|
|
98
154
|
const child = (0, node_child_process_1.spawn)(cmdOpts.exec, { shell: true, stdio: ['pipe', 'inherit', 'inherit'] });
|
|
99
|
-
child.stdin.end(
|
|
155
|
+
child.stdin.end(JSON.stringify(msg) + '\n');
|
|
100
156
|
}
|
|
101
157
|
else {
|
|
102
|
-
process.stdout.write(
|
|
158
|
+
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
103
159
|
}
|
|
104
160
|
since = msg.createdAt;
|
|
105
161
|
}
|
|
106
162
|
});
|
|
163
|
+
program
|
|
164
|
+
.command('send')
|
|
165
|
+
.description('Send an email from an identity')
|
|
166
|
+
.requiredOption('--identity <ref>', IDENTITY_HELP)
|
|
167
|
+
.requiredOption('--to <email>', 'recipient email')
|
|
168
|
+
.requiredOption('--subject <subject>', 'subject line')
|
|
169
|
+
.option('--text <text>', 'plain-text body')
|
|
170
|
+
.option('--html <html>', 'HTML body')
|
|
171
|
+
.option('--reply-to <msgId>', 'thread the reply to this inbound message id (sets In-Reply-To)')
|
|
172
|
+
.action(async (cmdOpts) => {
|
|
173
|
+
const opts = globalOpts();
|
|
174
|
+
try {
|
|
175
|
+
const client = new client_1.GatewayClient();
|
|
176
|
+
const identityId = await (0, identityRef_1.resolveIdentityId)(client, cmdOpts.identity);
|
|
177
|
+
const msg = await client.request('/v1/messages', {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
body: {
|
|
180
|
+
identityId,
|
|
181
|
+
to: cmdOpts.to,
|
|
182
|
+
subject: cmdOpts.subject,
|
|
183
|
+
text: cmdOpts.text,
|
|
184
|
+
html: cmdOpts.html,
|
|
185
|
+
inReplyTo: cmdOpts.replyTo,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
(0, output_1.printSuccess)(msg, `Sent to ${cmdOpts.to} (${msg.id})`, opts);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
process.exit((0, output_1.printError)(err, opts));
|
|
192
|
+
}
|
|
193
|
+
});
|
|
107
194
|
}
|
|
108
195
|
//# sourceMappingURL=inbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTokenCommand = registerTokenCommand;
|
|
4
|
+
const credentials_1 = require("../credentials");
|
|
5
|
+
/**
|
|
6
|
+
* `sente token` — print the stored API key to stdout (nothing else), so it can
|
|
7
|
+
* be piped into a project's .env without echoing the secret into a chat:
|
|
8
|
+
* echo "SENTE_API_TOKEN=$(sente token)" >> .env
|
|
9
|
+
* Mirrors `gh auth token`. The key authenticates as the whole organization.
|
|
10
|
+
*/
|
|
11
|
+
function registerTokenCommand(program, _globalOpts) {
|
|
12
|
+
program
|
|
13
|
+
.command('token')
|
|
14
|
+
.description('Print the stored API key (for piping into .env)')
|
|
15
|
+
.action(() => {
|
|
16
|
+
const creds = (0, credentials_1.loadCredentials)();
|
|
17
|
+
if (!creds) {
|
|
18
|
+
process.stderr.write('Not logged in. Run `sente login` first, or set SENTE_API_TOKEN.\n');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
process.stdout.write(creds.token + '\n');
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":";;AAUA,oDAYC;AArBD,gDAAiD;AAGjD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,OAAgB,EAAE,WAA6B;IAClF,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/webhook.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerWebhookCommands = registerWebhookCommands;
|
|
4
4
|
const client_1 = require("../client");
|
|
5
|
+
const identityRef_1 = require("../identityRef");
|
|
5
6
|
const output_1 = require("../output");
|
|
6
7
|
/**
|
|
7
8
|
* `sente webhook …` — register YOUR endpoint so Sente pushes message events to it.
|
|
@@ -13,18 +14,19 @@ function registerWebhookCommands(program, globalOpts) {
|
|
|
13
14
|
.command('register')
|
|
14
15
|
.description('Point Sente at your HTTPS endpoint (idempotent per url+identity)')
|
|
15
16
|
.requiredOption('--url <url>', 'your HTTPS endpoint')
|
|
16
|
-
.option('--identity <
|
|
17
|
+
.option('--identity <ref>', 'scope to one identity — id, email, or local-part (default: all of the org)')
|
|
17
18
|
.option('--events <list>', 'comma-separated events', 'message.received')
|
|
18
19
|
.action(async (cmdOpts) => {
|
|
19
20
|
const opts = globalOpts();
|
|
20
21
|
try {
|
|
22
|
+
const client = new client_1.GatewayClient();
|
|
21
23
|
const body = {
|
|
22
24
|
url: cmdOpts.url,
|
|
23
25
|
events: (cmdOpts.events ?? 'message.received').split(',').map((e) => e.trim()).filter(Boolean),
|
|
24
26
|
};
|
|
25
27
|
if (cmdOpts.identity)
|
|
26
|
-
body.identityId = cmdOpts.identity;
|
|
27
|
-
const w = await
|
|
28
|
+
body.identityId = await (0, identityRef_1.resolveIdentityId)(client, cmdOpts.identity);
|
|
29
|
+
const w = await client.request('/v1/webhooks', { method: 'POST', body });
|
|
28
30
|
(0, output_1.printSuccess)(w, () => process.stdout.write(`Registered webhook ${w.id} → ${w.url}\nSecret: ${w.secret ?? '(unchanged)'}\nVerify the X-Sente-Secret header on each delivery.\n`), opts);
|
|
29
31
|
}
|
|
30
32
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveIdentityId = resolveIdentityId;
|
|
4
|
+
const client_1 = require("./client");
|
|
5
|
+
/**
|
|
6
|
+
* Resolve an `--identity` value to the `idt_…` id. Accepts:
|
|
7
|
+
* - the id itself (`idt_…`) → returned as-is
|
|
8
|
+
* - the full email (`x@agents…`) → looked up
|
|
9
|
+
* - the local-part (`x`) → looked up (matched against the email's local-part)
|
|
10
|
+
* Names are NOT accepted — they aren't unique. One list call; cached per process.
|
|
11
|
+
*/
|
|
12
|
+
let cache = null;
|
|
13
|
+
async function resolveIdentityId(client, value) {
|
|
14
|
+
const v = value.trim();
|
|
15
|
+
if (/^idt_/.test(v))
|
|
16
|
+
return v;
|
|
17
|
+
if (!cache)
|
|
18
|
+
cache = await client.request('/v1/identities');
|
|
19
|
+
const needle = v.toLowerCase();
|
|
20
|
+
const match = cache.find((r) => r.email.toLowerCase() === needle || r.email.toLowerCase().split('@')[0] === needle);
|
|
21
|
+
if (!match) {
|
|
22
|
+
throw new client_1.ApiError(404, 'IDENTITY_NOT_FOUND', `No identity matching "${value}". Use its local-part, email, or id — see \`sente identity list\`.`);
|
|
23
|
+
}
|
|
24
|
+
return match.id;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=identityRef.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identityRef.js","sourceRoot":"","sources":["../src/identityRef.ts"],"names":[],"mappings":";;AAgBA,8CAgBC;AAhCD,qCAAmD;AAOnD;;;;;;GAMG;AACH,IAAI,KAAK,GAAyB,IAAI,CAAC;AAEhC,KAAK,UAAU,iBAAiB,CAAC,MAAqB,EAAE,KAAa;IAC1E,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAgB,gBAAgB,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAC1F,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,iBAAQ,CAChB,GAAG,EACH,oBAAoB,EACpB,yBAAyB,KAAK,oEAAoE,CACnG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const login_1 = require("./commands/login");
|
|
6
6
|
const whoami_1 = require("./commands/whoami");
|
|
7
|
+
const token_1 = require("./commands/token");
|
|
7
8
|
const project_1 = require("./commands/project");
|
|
8
9
|
const workflow_1 = require("./commands/workflow");
|
|
9
10
|
const appGraph_1 = require("./commands/appGraph");
|
|
@@ -28,8 +29,8 @@ void (0, autoupdate_1.checkForCliUpdate)();
|
|
|
28
29
|
const program = new commander_1.Command();
|
|
29
30
|
program
|
|
30
31
|
.name('sente')
|
|
31
|
-
.description('Sente CLI --
|
|
32
|
-
.version('0.
|
|
32
|
+
.description('Sente CLI -- give your AI agents managed email identities from the terminal and Claude Code')
|
|
33
|
+
.version('0.11.0')
|
|
33
34
|
.option('--json', 'Emit machine-readable JSON instead of human output');
|
|
34
35
|
/**
|
|
35
36
|
* Global options aren't auto-propagated to subcommands by Commander, so we
|
|
@@ -39,6 +40,7 @@ program
|
|
|
39
40
|
const globalOpts = () => program.opts();
|
|
40
41
|
(0, login_1.registerLoginCommand)(program, globalOpts);
|
|
41
42
|
(0, whoami_1.registerWhoamiCommand)(program, globalOpts);
|
|
43
|
+
(0, token_1.registerTokenCommand)(program, globalOpts);
|
|
42
44
|
(0, init_1.registerInitCommand)(program, globalOpts);
|
|
43
45
|
(0, init_1.registerInstallSkillCommand)(program, globalOpts);
|
|
44
46
|
(0, project_1.registerProjectCommands)(program, globalOpts);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,gDAAkF;AAClF,kDAA+D;AAC/D,kDAA+D;AAC/D,0CAAuD;AACvD,0CAAmF;AACnF,8CAA2D;AAC3D,kDAA+D;AAC/D,4DAAyE;AACzE,0CAAuD;AACvD,kDAA+D;AAC/D,4CAAyD;AACzD,gDAA6D;AAC7D,mDAA+E;AAG/E,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,IAAA,mCAAsB,GAAE,CAAC;AAEzB,wEAAwE;AACxE,uEAAuE;AACvE,6DAA6D;AAC7D,KAAK,IAAA,8BAAiB,GAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,4CAAwD;AACxD,gDAAkF;AAClF,kDAA+D;AAC/D,kDAA+D;AAC/D,0CAAuD;AACvD,0CAAmF;AACnF,8CAA2D;AAC3D,kDAA+D;AAC/D,4DAAyE;AACzE,0CAAuD;AACvD,kDAA+D;AAC/D,4CAAyD;AACzD,gDAA6D;AAC7D,mDAA+E;AAG/E,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,IAAA,mCAAsB,GAAE,CAAC;AAEzB,wEAAwE;AACxE,uEAAuE;AACvE,6DAA6D;AAC7D,KAAK,IAAA,8BAAiB,GAAE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,6FAA6F,CAAC;KAC1G,OAAO,CAAC,QAAQ,CAAC;KACjB,MAAM,CAAC,QAAQ,EAAE,oDAAoD,CAAC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,UAAU,GAAG,GAAe,EAAE,CAAC,OAAO,CAAC,IAAI,EAAc,CAAC;AAEhE,IAAA,4BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,8BAAqB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC3C,IAAA,4BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,0BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,kCAA2B,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjD,IAAA,iCAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC7C,IAAA,6BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACzC,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,+BAAsB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC5C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,6CAA6B,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACnD,IAAA,2BAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1C,IAAA,mCAAwB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC9C,IAAA,6BAAqB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC3C,IAAA,iCAAuB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAE7C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,wEAAwE;IACxE,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -65,16 +65,18 @@ Discover live options with `sente --help` and `sente <command> --help`. Canonica
|
|
|
65
65
|
|---|---|
|
|
66
66
|
| `sente login` | Sign in (browser/Auth0) and store an API key in `~/.sente/credentials` |
|
|
67
67
|
| `sente whoami` | Show the authenticated account + organization |
|
|
68
|
+
| `sente token` | Print the stored API key (for piping into .env: `echo "SENTE_API_TOKEN=$(sente token)" >> .env`) — never echo it into chat |
|
|
68
69
|
| `sente identity create [--name <n>] [--description <d>] [--local-part <lp>] [--on-conflict error\|suffix]` | Create an identity; returns `{ id, email }`. Default address is random; `--local-part` chooses it (409 if taken unless `--on-conflict suffix`) |
|
|
69
70
|
| `sente identity list` | List the organization's identities |
|
|
70
71
|
| `sente identity show <id>` | Show one identity |
|
|
71
72
|
| `sente inbox --identity <id> [--since <ts>] [--limit <n>]` | List recent messages (returns immediately) |
|
|
72
73
|
| `sente wait --identity <id> [--since <ts>] [--timeout <s>]` | Block until the next matching message (long-poll) |
|
|
73
|
-
| `sente listen --identity <
|
|
74
|
+
| `sente listen --identity <ref> [--exec <cmd>] [--forward <url>]` | Stream messages as they arrive; `--exec` runs a command per message, `--forward` POSTs each inbound message to a local URL as a real Sente webhook (test a webhook handler with no public URL; sends `x-sente-secret` from `SENTE_WEBHOOK_SECRET`) |
|
|
75
|
+
| `sente send --identity <ref> --to <email> --subject <s> [--text <t>] [--html <h>] [--reply-to <msgId>]` | Send an email **from** the identity. `--reply-to <inbound msg id>` threads it as a reply (sets In-Reply-To) |
|
|
74
76
|
| `sente webhook register --url <url> [--identity <id>] [--events <list>]` | Point Sente at your HTTPS endpoint; returns the org webhook secret. Idempotent per (url, identity) |
|
|
75
77
|
| `sente webhook list` / `sente webhook delete <id>` | Manage webhooks |
|
|
76
78
|
|
|
77
|
-
`--json` on any command emits machine-readable output.
|
|
79
|
+
Anywhere a command takes `--identity`, pass the **id, email, or local-part** — all resolve to the same identity. `--json` on any command emits machine-readable output.
|
|
78
80
|
|
|
79
81
|
## Rules (important)
|
|
80
82
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sente-labs/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Sente CLI -- give your AI agents managed email identities: create identities, receive and react to email, manage webhooks, from your terminal and Claude Code.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sente": "dist/index.js"
|