oneclaw 0.1.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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/dist/adapters/index.d.ts +4 -0
  4. package/dist/adapters/index.js +36 -0
  5. package/dist/adapters/index.js.map +1 -0
  6. package/dist/adapters/nanoclaw.d.ts +6 -0
  7. package/dist/adapters/nanoclaw.js +94 -0
  8. package/dist/adapters/nanoclaw.js.map +1 -0
  9. package/dist/adapters/openclaw.d.ts +30 -0
  10. package/dist/adapters/openclaw.js +85 -0
  11. package/dist/adapters/openclaw.js.map +1 -0
  12. package/dist/adapters/owpenbot.d.ts +39 -0
  13. package/dist/adapters/owpenbot.js +130 -0
  14. package/dist/adapters/owpenbot.js.map +1 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.js +268 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/core/doctor.d.ts +6 -0
  19. package/dist/core/doctor.js +41 -0
  20. package/dist/core/doctor.js.map +1 -0
  21. package/dist/core/fs.d.ts +2 -0
  22. package/dist/core/fs.js +19 -0
  23. package/dist/core/fs.js.map +1 -0
  24. package/dist/core/packs.d.ts +6 -0
  25. package/dist/core/packs.js +75 -0
  26. package/dist/core/packs.js.map +1 -0
  27. package/dist/core/paths.d.ts +6 -0
  28. package/dist/core/paths.js +11 -0
  29. package/dist/core/paths.js.map +1 -0
  30. package/dist/core/run-state.d.ts +25 -0
  31. package/dist/core/run-state.js +34 -0
  32. package/dist/core/run-state.js.map +1 -0
  33. package/dist/core/schema.d.ts +330 -0
  34. package/dist/core/schema.js +72 -0
  35. package/dist/core/schema.js.map +1 -0
  36. package/dist/core/secrets.d.ts +9 -0
  37. package/dist/core/secrets.js +65 -0
  38. package/dist/core/secrets.js.map +1 -0
  39. package/dist/core/types.d.ts +69 -0
  40. package/dist/core/types.js +3 -0
  41. package/dist/core/types.js.map +1 -0
  42. package/dist/core/workflow.d.ts +48 -0
  43. package/dist/core/workflow.js +92 -0
  44. package/dist/core/workflow.js.map +1 -0
  45. package/dist/providers/agentmail.d.ts +2 -0
  46. package/dist/providers/agentmail.js +145 -0
  47. package/dist/providers/agentmail.js.map +1 -0
  48. package/dist/providers/bitwarden.d.ts +2 -0
  49. package/dist/providers/bitwarden.js +225 -0
  50. package/dist/providers/bitwarden.js.map +1 -0
  51. package/dist/providers/index.d.ts +5 -0
  52. package/dist/providers/index.js +15 -0
  53. package/dist/providers/index.js.map +1 -0
  54. package/dist/providers/telegram.d.ts +2 -0
  55. package/dist/providers/telegram.js +91 -0
  56. package/dist/providers/telegram.js.map +1 -0
  57. package/package.json +40 -0
@@ -0,0 +1,92 @@
1
+ import { resolveSecret, setSecret } from "./secrets.js";
2
+ function ensureProviderState(run, provider) {
3
+ if (!run.providers[provider]) {
4
+ run.providers[provider] = {
5
+ cursor: 0,
6
+ completed: false,
7
+ data: {},
8
+ steps: [],
9
+ };
10
+ }
11
+ return run.providers[provider];
12
+ }
13
+ function upsertStep(providerState, next) {
14
+ const idx = providerState.steps.findIndex((s) => s.stepId === next.stepId);
15
+ if (idx === -1) {
16
+ providerState.steps.push(next);
17
+ return;
18
+ }
19
+ providerState.steps[idx] = next;
20
+ }
21
+ function asString(value) {
22
+ if (value === undefined)
23
+ return undefined;
24
+ if (typeof value === "boolean")
25
+ return value ? "true" : "false";
26
+ const trimmed = value.trim();
27
+ return trimmed || undefined;
28
+ }
29
+ function asFlag(value) {
30
+ if (typeof value === "boolean")
31
+ return value;
32
+ if (value === undefined)
33
+ return false;
34
+ return ["1", "true", "yes", "on"].includes(value.toLowerCase());
35
+ }
36
+ export async function runProviderWorkflow(input) {
37
+ const providerState = ensureProviderState(input.run, input.workflow.provider);
38
+ const context = {
39
+ pack: input.pack,
40
+ nonInteractive: input.nonInteractive,
41
+ options: input.options,
42
+ state: providerState.data,
43
+ getOption: (key) => asString(input.options[key]),
44
+ getFlag: (key) => asFlag(input.options[key]),
45
+ ask: input.ask,
46
+ setData: (key, value) => {
47
+ providerState.data[key] = value;
48
+ },
49
+ getData: (key) => providerState.data[key],
50
+ putSecret: (provider, key, value) => setSecret(input.pack.packId, provider, key, value),
51
+ resolveSecret,
52
+ updatePack: (next) => {
53
+ input.pack = next;
54
+ },
55
+ log: input.log,
56
+ };
57
+ for (let i = providerState.cursor; i < input.workflow.steps.length; i += 1) {
58
+ const step = input.workflow.steps[i];
59
+ input.log(`[${input.workflow.provider}] ${step.id}: ${step.detail}`);
60
+ const result = await step.run(context);
61
+ const timestamp = new Date().toISOString();
62
+ if (result.status === "blocked") {
63
+ upsertStep(providerState, {
64
+ stepId: step.id,
65
+ kind: step.kind,
66
+ status: "blocked",
67
+ detail: result.detail,
68
+ updatedAt: timestamp,
69
+ });
70
+ providerState.cursor = i;
71
+ providerState.completed = false;
72
+ return {
73
+ status: "blocked",
74
+ blockedStepId: step.id,
75
+ blockedReason: result.detail,
76
+ };
77
+ }
78
+ upsertStep(providerState, {
79
+ stepId: step.id,
80
+ kind: step.kind,
81
+ status: "completed",
82
+ detail: result.detail || step.detail,
83
+ updatedAt: timestamp,
84
+ });
85
+ providerState.cursor = i + 1;
86
+ }
87
+ providerState.completed = true;
88
+ return {
89
+ status: "completed",
90
+ };
91
+ }
92
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/core/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ProviderWorkflow } from "../core/workflow.js";
2
+ export declare function buildAgentmailWorkflow(): ProviderWorkflow;
@@ -0,0 +1,145 @@
1
+ function normalizeInboxId(payload) {
2
+ return payload.inbox_id || payload.inboxId;
3
+ }
4
+ function readOption(ctx, key) {
5
+ return ctx.getOption(key);
6
+ }
7
+ async function requestAgentmail(apiKey, method, route, body) {
8
+ const response = await fetch(`https://api.agentmail.to/v0${route}`, {
9
+ method,
10
+ headers: {
11
+ Authorization: `Bearer ${apiKey}`,
12
+ "Content-Type": "application/json",
13
+ },
14
+ ...(body ? { body: JSON.stringify(body) } : {}),
15
+ });
16
+ const text = await response.text();
17
+ const parsed = text ? JSON.parse(text) : undefined;
18
+ if (!response.ok) {
19
+ throw new Error(`AgentMail ${method} ${route} failed (${response.status}): ${text.slice(0, 500)}`);
20
+ }
21
+ return parsed;
22
+ }
23
+ function randomSuffix() {
24
+ return Math.random().toString(36).slice(2, 8);
25
+ }
26
+ async function resolveApiKey(ctx) {
27
+ const explicit = readOption(ctx, "agentmailApiKey") || process.env.AGENTMAIL_API_KEY;
28
+ if (explicit)
29
+ return explicit;
30
+ const fromPack = ctx.pack.accounts.email?.provider === "agentmail"
31
+ ? ctx.resolveSecret(ctx.pack.accounts.email.apiKeyRef)
32
+ : undefined;
33
+ if (fromPack)
34
+ return fromPack;
35
+ if (ctx.nonInteractive)
36
+ return undefined;
37
+ return ctx.ask("AgentMail API key: ");
38
+ }
39
+ export function buildAgentmailWorkflow() {
40
+ return {
41
+ provider: "agentmail",
42
+ steps: [
43
+ {
44
+ id: "agentmail-credentials",
45
+ kind: "manual_checkpoint",
46
+ detail: "Resolve AgentMail API key",
47
+ run: async (ctx) => {
48
+ const apiKey = await resolveApiKey(ctx);
49
+ if (!apiKey) {
50
+ return {
51
+ status: "blocked",
52
+ detail: "Missing AgentMail API key. Set AGENTMAIL_API_KEY or pass --agentmail-api-key.",
53
+ };
54
+ }
55
+ ctx.setData("apiKey", apiKey);
56
+ return { status: "completed", detail: "AgentMail API key ready" };
57
+ },
58
+ },
59
+ {
60
+ id: "agentmail-create-inbox",
61
+ kind: "api_call",
62
+ detail: "Create or reuse AgentMail inbox",
63
+ run: async (ctx) => {
64
+ const apiKey = ctx.getData("apiKey");
65
+ if (!apiKey) {
66
+ return { status: "blocked", detail: "Missing AgentMail API key in workflow state." };
67
+ }
68
+ if (ctx.pack.accounts.email?.provider === "agentmail" && !ctx.getFlag("forceAgentmailCreate")) {
69
+ ctx.setData("inboxId", ctx.pack.accounts.email.inboxId);
70
+ ctx.setData("address", ctx.pack.accounts.email.address);
71
+ return { status: "completed", detail: `Reusing inbox ${ctx.pack.accounts.email.inboxId}` };
72
+ }
73
+ const explicitInboxId = readOption(ctx, "agentmailInboxId");
74
+ if (explicitInboxId) {
75
+ ctx.setData("inboxId", explicitInboxId);
76
+ ctx.setData("address", explicitInboxId);
77
+ return { status: "completed", detail: `Using provided inbox ${explicitInboxId}` };
78
+ }
79
+ const username = readOption(ctx, "agentmailUsername") || `${ctx.pack.packId}-${randomSuffix()}`;
80
+ const domain = readOption(ctx, "agentmailDomain");
81
+ const displayName = readOption(ctx, "agentmailDisplayName") || `${ctx.pack.packId} agent`;
82
+ const payload = {
83
+ username,
84
+ ...(domain ? { domain } : {}),
85
+ display_name: displayName,
86
+ client_id: `${ctx.pack.packId}-${Date.now()}`,
87
+ };
88
+ const created = (await requestAgentmail(apiKey, "POST", "/inboxes", payload));
89
+ const inboxId = normalizeInboxId(created);
90
+ if (!inboxId) {
91
+ return {
92
+ status: "blocked",
93
+ detail: "AgentMail inbox creation succeeded but inbox_id missing in response.",
94
+ };
95
+ }
96
+ ctx.setData("inboxId", inboxId);
97
+ ctx.setData("address", inboxId);
98
+ return { status: "completed", detail: `Created inbox ${inboxId}` };
99
+ },
100
+ },
101
+ {
102
+ id: "agentmail-verify-inbox",
103
+ kind: "verify",
104
+ detail: "Verify AgentMail inbox exists",
105
+ run: async (ctx) => {
106
+ const apiKey = ctx.getData("apiKey");
107
+ const inboxId = ctx.getData("inboxId");
108
+ if (!apiKey || !inboxId) {
109
+ return { status: "blocked", detail: "Cannot verify inbox without apiKey and inboxId." };
110
+ }
111
+ await requestAgentmail(apiKey, "GET", `/inboxes/${encodeURIComponent(inboxId)}`);
112
+ return { status: "completed", detail: `Verified inbox ${inboxId}` };
113
+ },
114
+ },
115
+ {
116
+ id: "agentmail-persist-pack",
117
+ kind: "persist_secret",
118
+ detail: "Persist AgentMail credentials in pack",
119
+ run: async (ctx) => {
120
+ const apiKey = ctx.getData("apiKey");
121
+ const inboxId = ctx.getData("inboxId");
122
+ const address = ctx.getData("address") || inboxId;
123
+ if (!apiKey || !inboxId || !address) {
124
+ return { status: "blocked", detail: "AgentMail workflow missing apiKey/inboxId/address." };
125
+ }
126
+ const apiKeyRef = ctx.putSecret("agentmail", "api_key", apiKey);
127
+ const webhookSecret = readOption(ctx, "agentmailWebhookSecret");
128
+ const webhookSecretRef = webhookSecret
129
+ ? ctx.putSecret("agentmail", "webhook_secret", webhookSecret)
130
+ : undefined;
131
+ ctx.pack.accounts.email = {
132
+ provider: "agentmail",
133
+ inboxId,
134
+ address,
135
+ apiKeyRef,
136
+ ...(webhookSecretRef ? { webhookSecretRef } : {}),
137
+ };
138
+ ctx.pack.updatedAt = new Date().toISOString();
139
+ return { status: "completed", detail: "AgentMail account saved into identity pack" };
140
+ },
141
+ },
142
+ ],
143
+ };
144
+ }
145
+ //# sourceMappingURL=agentmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentmail.js","sourceRoot":"","sources":["../../src/providers/agentmail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ProviderWorkflow } from "../core/workflow.js";
2
+ export declare function buildBitwardenWorkflow(): ProviderWorkflow;
@@ -0,0 +1,225 @@
1
+ import { spawnSync } from "node:child_process";
2
+ function runBw(args, options) {
3
+ const out = spawnSync("bw", args, {
4
+ encoding: "utf8",
5
+ input: options?.input,
6
+ env: {
7
+ ...process.env,
8
+ ...(options?.env || {}),
9
+ },
10
+ });
11
+ return {
12
+ ok: out.status === 0,
13
+ stdout: (out.stdout || "").trim(),
14
+ stderr: (out.stderr || "").trim(),
15
+ };
16
+ }
17
+ function hasBwCli() {
18
+ const out = spawnSync("sh", ["-c", "command -v bw"], { encoding: "utf8" });
19
+ return out.status === 0;
20
+ }
21
+ async function resolveCredential(ctx, key, prompt) {
22
+ const explicit = ctx.getOption(key);
23
+ if (explicit)
24
+ return explicit;
25
+ const remembered = ctx.getData(key);
26
+ if (remembered)
27
+ return remembered;
28
+ if (ctx.nonInteractive)
29
+ return undefined;
30
+ return ctx.ask(prompt);
31
+ }
32
+ function normalizeRefs(value) {
33
+ return value
34
+ .split(",")
35
+ .map((item) => item.trim())
36
+ .filter(Boolean);
37
+ }
38
+ function findExistingItem(session, name) {
39
+ const list = runBw(["list", "items", "--search", name, "--session", session]);
40
+ if (!list.ok || !list.stdout)
41
+ return undefined;
42
+ try {
43
+ const items = JSON.parse(list.stdout);
44
+ const exact = items.find((item) => item.name === name && item.id);
45
+ if (exact?.id)
46
+ return exact.id;
47
+ const first = items.find((item) => item.id);
48
+ return first?.id;
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ function createSecureNote(session, name, notes) {
55
+ const existing = findExistingItem(session, name);
56
+ if (existing)
57
+ return existing;
58
+ const template = {
59
+ type: 2,
60
+ name,
61
+ notes,
62
+ };
63
+ const encoded = runBw(["encode"], { input: JSON.stringify(template) });
64
+ if (!encoded.ok || !encoded.stdout)
65
+ return undefined;
66
+ const created = runBw(["create", "item", encoded.stdout, "--session", session]);
67
+ if (!created.ok || !created.stdout)
68
+ return undefined;
69
+ try {
70
+ const payload = JSON.parse(created.stdout);
71
+ return payload.id;
72
+ }
73
+ catch {
74
+ return undefined;
75
+ }
76
+ }
77
+ function upsertRef(existing, next) {
78
+ if (existing.includes(next))
79
+ return existing;
80
+ return [...existing, next];
81
+ }
82
+ function completeSignupByFlag(ctx) {
83
+ if (ctx.getFlag("bitwardenSkipSignup"))
84
+ return true;
85
+ if (ctx.getFlag("bitwardenAlreadyCreated"))
86
+ return true;
87
+ return ctx.getData("bitwardenSignupComplete") === "true";
88
+ }
89
+ export function buildBitwardenWorkflow() {
90
+ return {
91
+ provider: "bitwarden",
92
+ steps: [
93
+ {
94
+ id: "bitwarden-credentials",
95
+ kind: "manual_checkpoint",
96
+ detail: "Resolve Bitwarden account credentials",
97
+ run: async (ctx) => {
98
+ const email = await resolveCredential(ctx, "bitwardenEmail", "Bitwarden account email: ");
99
+ const password = await resolveCredential(ctx, "bitwardenPassword", "Bitwarden master password: ");
100
+ if (!email || !password) {
101
+ return {
102
+ status: "blocked",
103
+ detail: "Bitwarden email/password required. Pass --bitwarden-email and --bitwarden-password.",
104
+ };
105
+ }
106
+ ctx.setData("bitwardenEmail", email);
107
+ ctx.setData("bitwardenPassword", password);
108
+ return { status: "completed", detail: `Credentials captured for ${email}` };
109
+ },
110
+ },
111
+ {
112
+ id: "bitwarden-signup",
113
+ kind: "browser_task",
114
+ detail: "Ensure Bitwarden account exists",
115
+ run: async (ctx) => {
116
+ if (completeSignupByFlag(ctx)) {
117
+ ctx.setData("bitwardenSignupComplete", "true");
118
+ return { status: "completed", detail: "Signup checkpoint acknowledged" };
119
+ }
120
+ const email = ctx.getData("bitwardenEmail") || "<your-email>";
121
+ return {
122
+ status: "blocked",
123
+ detail: `Create Bitwarden account in browser using ${email}: https://vault.bitwarden.com/#/register . Then re-run with --bitwarden-skip-signup to continue.`,
124
+ };
125
+ },
126
+ },
127
+ {
128
+ id: "bitwarden-login-verify",
129
+ kind: "verify",
130
+ detail: "Log into Bitwarden CLI and capture session",
131
+ run: async (ctx) => {
132
+ if (!hasBwCli()) {
133
+ return {
134
+ status: "blocked",
135
+ detail: "Bitwarden CLI (bw) not found. Install from https://bitwarden.com/help/cli/",
136
+ };
137
+ }
138
+ const email = ctx.getData("bitwardenEmail");
139
+ const password = ctx.getData("bitwardenPassword");
140
+ if (!email || !password) {
141
+ return { status: "blocked", detail: "Missing Bitwarden credentials in state." };
142
+ }
143
+ const login = runBw(["login", email, password, "--raw"]);
144
+ if (login.ok && login.stdout) {
145
+ ctx.setData("bitwardenSession", login.stdout);
146
+ return { status: "completed", detail: "Bitwarden login verified" };
147
+ }
148
+ const unlock = runBw(["unlock", "--passwordenv", "ONECLAW_BITWARDEN_PASSWORD", "--raw"], {
149
+ env: { ONECLAW_BITWARDEN_PASSWORD: password },
150
+ });
151
+ if (unlock.ok && unlock.stdout) {
152
+ ctx.setData("bitwardenSession", unlock.stdout);
153
+ return { status: "completed", detail: "Bitwarden unlock verified" };
154
+ }
155
+ return {
156
+ status: "blocked",
157
+ detail: `Bitwarden login failed: ${login.stderr || unlock.stderr || "unknown error"}`,
158
+ };
159
+ },
160
+ },
161
+ {
162
+ id: "bitwarden-seed-items",
163
+ kind: "api_call",
164
+ detail: "Create initial Bitwarden secure notes for identity pack",
165
+ run: async (ctx) => {
166
+ const session = ctx.getData("bitwardenSession");
167
+ if (!session) {
168
+ return { status: "blocked", detail: "Bitwarden session missing." };
169
+ }
170
+ const vault = ctx.getOption("bitwardenVault") || ctx.pack.accounts.bitwarden?.vault || "oneclaw";
171
+ const refs = normalizeRefs(ctx.getData("bitwardenItemRefs") || "");
172
+ const metadataId = createSecureNote(session, `oneclaw/${ctx.pack.packId}/metadata`, `Identity pack ${ctx.pack.packId}\nGenerated at ${new Date().toISOString()}\nVault: ${vault}`);
173
+ if (!metadataId) {
174
+ return {
175
+ status: "blocked",
176
+ detail: "Failed creating Bitwarden metadata item. Ensure bw is unlocked and network is available.",
177
+ };
178
+ }
179
+ let nextRefs = upsertRef(refs, `bw://item/${metadataId}`);
180
+ if (ctx.pack.accounts.email?.provider === "agentmail") {
181
+ const item = createSecureNote(session, `oneclaw/${ctx.pack.packId}/agentmail`, `AgentMail inbox: ${ctx.pack.accounts.email.inboxId}`);
182
+ if (item)
183
+ nextRefs = upsertRef(nextRefs, `bw://item/${item}`);
184
+ }
185
+ if (ctx.pack.accounts.telegram?.provider === "telegram") {
186
+ const item = createSecureNote(session, `oneclaw/${ctx.pack.packId}/telegram`, `Telegram bot: @${ctx.pack.accounts.telegram.botUsername}`);
187
+ if (item)
188
+ nextRefs = upsertRef(nextRefs, `bw://item/${item}`);
189
+ }
190
+ ctx.setData("bitwardenVault", vault);
191
+ ctx.setData("bitwardenItemRefs", nextRefs.join(","));
192
+ return { status: "completed", detail: `Seeded ${nextRefs.length} Bitwarden items` };
193
+ },
194
+ },
195
+ {
196
+ id: "bitwarden-persist-pack",
197
+ kind: "persist_secret",
198
+ detail: "Persist Bitwarden account in identity pack",
199
+ run: async (ctx) => {
200
+ const email = ctx.getData("bitwardenEmail");
201
+ const password = ctx.getData("bitwardenPassword");
202
+ const session = ctx.getData("bitwardenSession");
203
+ const vault = ctx.getData("bitwardenVault") || ctx.getOption("bitwardenVault") || "oneclaw";
204
+ const itemRefs = normalizeRefs(ctx.getData("bitwardenItemRefs") || "");
205
+ if (!email || !password) {
206
+ return { status: "blocked", detail: "Bitwarden email/password missing before persist." };
207
+ }
208
+ const masterPasswordRef = ctx.putSecret("bitwarden", "master_password", password);
209
+ const sessionRef = session ? ctx.putSecret("bitwarden", "session", session) : undefined;
210
+ ctx.pack.accounts.bitwarden = {
211
+ provider: "bitwarden",
212
+ accountEmail: email,
213
+ vault,
214
+ itemRefs,
215
+ ...(sessionRef ? { sessionRef } : {}),
216
+ masterPasswordRef,
217
+ };
218
+ ctx.pack.updatedAt = new Date().toISOString();
219
+ return { status: "completed", detail: "Bitwarden account saved into identity pack" };
220
+ },
221
+ },
222
+ ],
223
+ };
224
+ }
225
+ //# sourceMappingURL=bitwarden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden.js","sourceRoot":"","sources":["../../src/providers/bitwarden.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ProviderWorkflow } from "../core/workflow.js";
2
+ export declare const PROVIDERS: readonly ["agentmail", "telegram", "bitwarden"];
3
+ export type ProviderId = (typeof PROVIDERS)[number];
4
+ export declare function isProviderId(value: string): value is ProviderId;
5
+ export declare function getWorkflow(provider: ProviderId): ProviderWorkflow;
@@ -0,0 +1,15 @@
1
+ import { buildAgentmailWorkflow } from "./agentmail.js";
2
+ import { buildBitwardenWorkflow } from "./bitwarden.js";
3
+ import { buildTelegramWorkflow } from "./telegram.js";
4
+ export const PROVIDERS = ["agentmail", "telegram", "bitwarden"];
5
+ export function isProviderId(value) {
6
+ return PROVIDERS.includes(value);
7
+ }
8
+ export function getWorkflow(provider) {
9
+ if (provider === "agentmail")
10
+ return buildAgentmailWorkflow();
11
+ if (provider === "telegram")
12
+ return buildTelegramWorkflow();
13
+ return buildBitwardenWorkflow();
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAGzE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAoB;IAC9C,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,sBAAsB,EAAE,CAAC;IAC9D,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,qBAAqB,EAAE,CAAC;IAC5D,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProviderWorkflow } from "../core/workflow.js";
2
+ export declare function buildTelegramWorkflow(): ProviderWorkflow;
@@ -0,0 +1,91 @@
1
+ function normalizeIdentityId(raw) {
2
+ const safe = (raw || "default").replace(/[^a-zA-Z0-9_.-]+/g, "-").replace(/^-+|-+$/g, "");
3
+ return safe || "default";
4
+ }
5
+ async function resolveToken(ctx) {
6
+ const explicit = ctx.getOption("telegramBotToken") || process.env.TELEGRAM_BOT_TOKEN;
7
+ if (explicit)
8
+ return explicit;
9
+ const fromPack = ctx.pack.accounts.telegram?.provider === "telegram"
10
+ ? ctx.resolveSecret(ctx.pack.accounts.telegram.tokenRef)
11
+ : undefined;
12
+ if (fromPack)
13
+ return fromPack;
14
+ if (ctx.nonInteractive)
15
+ return undefined;
16
+ return ctx.ask("Telegram bot token: ");
17
+ }
18
+ async function getMe(token) {
19
+ const res = await fetch(`https://api.telegram.org/bot${encodeURIComponent(token)}/getMe`);
20
+ return (await res.json());
21
+ }
22
+ export function buildTelegramWorkflow() {
23
+ return {
24
+ provider: "telegram",
25
+ steps: [
26
+ {
27
+ id: "telegram-create-bot",
28
+ kind: "browser_task",
29
+ detail: "Create Telegram bot with BotFather or provide token",
30
+ run: async (ctx) => {
31
+ const token = await resolveToken(ctx);
32
+ if (!token) {
33
+ return {
34
+ status: "blocked",
35
+ detail: "Telegram bot token missing. Create bot with @BotFather and re-run with --telegram-bot-token.",
36
+ };
37
+ }
38
+ ctx.setData("telegramBotToken", token);
39
+ return { status: "completed", detail: "Telegram bot token available" };
40
+ },
41
+ },
42
+ {
43
+ id: "telegram-verify-token",
44
+ kind: "verify",
45
+ detail: "Verify Telegram bot token via getMe",
46
+ run: async (ctx) => {
47
+ const token = ctx.getData("telegramBotToken");
48
+ if (!token)
49
+ return { status: "blocked", detail: "Telegram token missing in state." };
50
+ const response = await getMe(token);
51
+ if (!response.ok || !response.result?.username) {
52
+ return {
53
+ status: "blocked",
54
+ detail: "Telegram token verification failed. Ensure token is valid and bot exists.",
55
+ };
56
+ }
57
+ ctx.setData("telegramBotUsername", response.result.username);
58
+ return { status: "completed", detail: `Verified @${response.result.username}` };
59
+ },
60
+ },
61
+ {
62
+ id: "telegram-persist-pack",
63
+ kind: "persist_secret",
64
+ detail: "Persist Telegram bot in identity pack",
65
+ run: async (ctx) => {
66
+ const token = ctx.getData("telegramBotToken");
67
+ const verifiedUsername = ctx.getData("telegramBotUsername");
68
+ const manualUsername = ctx.getOption("telegramBotUsername");
69
+ const username = manualUsername || verifiedUsername;
70
+ if (!token || !username) {
71
+ return {
72
+ status: "blocked",
73
+ detail: "Missing Telegram token or username during persist step.",
74
+ };
75
+ }
76
+ const identityId = normalizeIdentityId(ctx.getOption("telegramIdentityId") || username);
77
+ const tokenRef = ctx.putSecret("telegram", "bot_token", token);
78
+ ctx.pack.accounts.telegram = {
79
+ provider: "telegram",
80
+ identityId,
81
+ botUsername: username,
82
+ tokenRef,
83
+ };
84
+ ctx.pack.updatedAt = new Date().toISOString();
85
+ return { status: "completed", detail: `Telegram bot @${username} saved` };
86
+ },
87
+ },
88
+ ],
89
+ };
90
+ }
91
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/providers/telegram.ts"],"names":[],"mappings":"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"}