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
package/dist/cli.js ADDED
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from "node:readline/promises";
3
+ import path from "node:path";
4
+ import process from "node:process";
5
+ import { Command } from "commander";
6
+ import { applyPack, exportPackToTarget, writeExport } from "./adapters/index.js";
7
+ import { runDoctor } from "./core/doctor.js";
8
+ import { appendProvisioningRun, ensurePack, loadPack, savePack } from "./core/packs.js";
9
+ import { clearRunState, createRunState, loadRunState, saveRunState } from "./core/run-state.js";
10
+ import { isTargetId, validatePack } from "./core/schema.js";
11
+ import { TARGETS } from "./core/types.js";
12
+ import { getWorkflow, isProviderId, PROVIDERS } from "./providers/index.js";
13
+ import { runProviderWorkflow } from "./core/workflow.js";
14
+ function parseCsv(input) {
15
+ if (!input)
16
+ return [];
17
+ return input
18
+ .split(",")
19
+ .map((item) => item.trim())
20
+ .filter(Boolean);
21
+ }
22
+ function parseTargets(raw) {
23
+ const items = parseCsv(raw);
24
+ if (!items.length)
25
+ return [];
26
+ const invalid = items.filter((item) => !isTargetId(item));
27
+ if (invalid.length) {
28
+ throw new Error(`Invalid targets: ${invalid.join(", ")}. Valid: ${TARGETS.join(", ")}`);
29
+ }
30
+ return items;
31
+ }
32
+ function parseProviders(raw) {
33
+ const items = parseCsv(raw);
34
+ const list = items.length ? items : [...PROVIDERS];
35
+ const invalid = list.filter((item) => !isProviderId(item));
36
+ if (invalid.length) {
37
+ throw new Error(`Invalid providers: ${invalid.join(", ")}. Valid: ${PROVIDERS.join(", ")}`);
38
+ }
39
+ return list;
40
+ }
41
+ async function askInteractive(prompt) {
42
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
43
+ return undefined;
44
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
45
+ try {
46
+ const answer = await rl.question(prompt);
47
+ const trimmed = answer.trim();
48
+ return trimmed || undefined;
49
+ }
50
+ finally {
51
+ rl.close();
52
+ }
53
+ }
54
+ function asLog(run) {
55
+ const steps = Object.entries(run.providers)
56
+ .flatMap(([provider, state]) => state.steps.map((step) => ({
57
+ provider,
58
+ stepId: step.stepId,
59
+ kind: step.kind,
60
+ status: step.status,
61
+ detail: step.detail,
62
+ updatedAt: step.updatedAt,
63
+ })))
64
+ .sort((a, b) => a.updatedAt.localeCompare(b.updatedAt));
65
+ return {
66
+ runId: run.runId,
67
+ startedAt: run.createdAt,
68
+ updatedAt: run.updatedAt,
69
+ completed: Object.values(run.providers).every((provider) => provider.completed),
70
+ steps,
71
+ };
72
+ }
73
+ function pickOutputPath(packId, target) {
74
+ if (target === "nanoclaw")
75
+ return path.resolve(`${packId}.nanoclaw.env`);
76
+ return path.resolve(`${packId}.${target}.json`);
77
+ }
78
+ function printValue(value, asJson) {
79
+ if (asJson) {
80
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
81
+ return;
82
+ }
83
+ if (typeof value === "string") {
84
+ process.stdout.write(`${value}\n`);
85
+ return;
86
+ }
87
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
88
+ }
89
+ const program = new Command();
90
+ program
91
+ .name("oneclaw")
92
+ .description("Identity pack CLI for AI assistants")
93
+ .version("0.1.0");
94
+ program
95
+ .command("provision")
96
+ .description("Provision identities and update the pack")
97
+ .requiredOption("--pack <packId>", "Identity pack id")
98
+ .option("--providers <providers>", `Comma-separated providers (${PROVIDERS.join(",")})`)
99
+ .option("--targets <targets>", `Comma-separated targets (${TARGETS.join(",")})`)
100
+ .option("--non-interactive", "Fail instead of prompting")
101
+ .option("--json", "Output json")
102
+ .option("--agentmail-api-key <value>")
103
+ .option("--agentmail-username <value>")
104
+ .option("--agentmail-domain <value>")
105
+ .option("--agentmail-display-name <value>")
106
+ .option("--agentmail-inbox-id <value>")
107
+ .option("--agentmail-webhook-secret <value>")
108
+ .option("--force-agentmail-create", "Force creating a new AgentMail inbox")
109
+ .option("--telegram-bot-token <value>")
110
+ .option("--telegram-bot-username <value>")
111
+ .option("--telegram-identity-id <value>")
112
+ .option("--bitwarden-email <value>")
113
+ .option("--bitwarden-password <value>")
114
+ .option("--bitwarden-vault <value>")
115
+ .option("--bitwarden-skip-signup", "Skip Bitwarden signup checkpoint")
116
+ .option("--bitwarden-already-created", "Alias for --bitwarden-skip-signup")
117
+ .action(async (opts) => {
118
+ const packId = String(opts.pack);
119
+ const providers = parseProviders(opts.providers);
120
+ const targets = parseTargets(opts.targets);
121
+ const nonInteractive = Boolean(opts.nonInteractive);
122
+ const asJson = Boolean(opts.json);
123
+ let pack = ensurePack(packId, targets);
124
+ let run = loadRunState(packId) || createRunState(packId);
125
+ for (const provider of providers) {
126
+ const workflow = getWorkflow(provider);
127
+ const result = await runProviderWorkflow({
128
+ workflow,
129
+ run,
130
+ pack,
131
+ options: {
132
+ agentmailApiKey: opts.agentmailApiKey,
133
+ agentmailUsername: opts.agentmailUsername,
134
+ agentmailDomain: opts.agentmailDomain,
135
+ agentmailDisplayName: opts.agentmailDisplayName,
136
+ agentmailInboxId: opts.agentmailInboxId,
137
+ agentmailWebhookSecret: opts.agentmailWebhookSecret,
138
+ forceAgentmailCreate: opts.forceAgentmailCreate,
139
+ telegramBotToken: opts.telegramBotToken,
140
+ telegramBotUsername: opts.telegramBotUsername,
141
+ telegramIdentityId: opts.telegramIdentityId,
142
+ bitwardenEmail: opts.bitwardenEmail,
143
+ bitwardenPassword: opts.bitwardenPassword,
144
+ bitwardenVault: opts.bitwardenVault,
145
+ bitwardenSkipSignup: opts.bitwardenSkipSignup,
146
+ bitwardenAlreadyCreated: opts.bitwardenAlreadyCreated,
147
+ },
148
+ nonInteractive,
149
+ ask: askInteractive,
150
+ log: (message) => {
151
+ if (!asJson)
152
+ process.stderr.write(`${message}\n`);
153
+ },
154
+ });
155
+ saveRunState(run);
156
+ pack = savePack(pack);
157
+ if (result.status === "blocked") {
158
+ printValue({
159
+ status: "blocked",
160
+ provider,
161
+ step: result.blockedStepId,
162
+ reason: result.blockedReason,
163
+ resumeCommand: `oneclaw provision --pack ${packId} --providers ${providers.join(",")}`,
164
+ }, asJson);
165
+ process.exitCode = 2;
166
+ return;
167
+ }
168
+ }
169
+ const runLog = asLog(run);
170
+ pack = appendProvisioningRun(pack, runLog);
171
+ clearRunState(packId);
172
+ printValue({
173
+ status: "ok",
174
+ packId,
175
+ providers,
176
+ targets: pack.targets,
177
+ accounts: Object.keys(pack.accounts),
178
+ }, asJson);
179
+ });
180
+ program
181
+ .command("export")
182
+ .description("Export a pack to target config format")
183
+ .requiredOption("--pack <packId>")
184
+ .requiredOption("--target <target>")
185
+ .option("--out <path>")
186
+ .option("--dry-run")
187
+ .option("--json")
188
+ .action((opts) => {
189
+ const target = String(opts.target);
190
+ if (!isTargetId(target)) {
191
+ throw new Error(`Invalid target: ${target}`);
192
+ }
193
+ const pack = loadPack(String(opts.pack));
194
+ const dryRun = Boolean(opts.dryRun);
195
+ const asJson = Boolean(opts.json);
196
+ const outPath = opts.out ? path.resolve(String(opts.out)) : pickOutputPath(pack.packId, target);
197
+ const rendered = writeExport(pack, target, outPath, dryRun);
198
+ printValue({
199
+ status: "ok",
200
+ target,
201
+ outPath,
202
+ dryRun,
203
+ preview: rendered.slice(0, 1200),
204
+ }, asJson);
205
+ });
206
+ program
207
+ .command("apply")
208
+ .description("Apply a pack directly to a target file")
209
+ .requiredOption("--pack <packId>")
210
+ .requiredOption("--target <target>")
211
+ .requiredOption("--path <path>")
212
+ .option("--dry-run")
213
+ .option("--json")
214
+ .action((opts) => {
215
+ const target = String(opts.target);
216
+ if (!isTargetId(target)) {
217
+ throw new Error(`Invalid target: ${target}`);
218
+ }
219
+ const pack = loadPack(String(opts.pack));
220
+ const dryRun = Boolean(opts.dryRun);
221
+ const result = applyPack(pack, target, path.resolve(String(opts.path)), dryRun);
222
+ printValue({ status: "ok", target, dryRun, result }, Boolean(opts.json));
223
+ });
224
+ program
225
+ .command("show")
226
+ .description("Show pack JSON")
227
+ .requiredOption("--pack <packId>")
228
+ .option("--json")
229
+ .action((opts) => {
230
+ const pack = loadPack(String(opts.pack));
231
+ printValue(pack, Boolean(opts.json));
232
+ });
233
+ program
234
+ .command("validate")
235
+ .description("Validate pack schema")
236
+ .requiredOption("--pack <packId>")
237
+ .option("--json")
238
+ .action((opts) => {
239
+ const pack = loadPack(String(opts.pack));
240
+ const validated = validatePack(pack);
241
+ printValue({ status: "ok", packId: validated.packId }, Boolean(opts.json));
242
+ });
243
+ program
244
+ .command("doctor")
245
+ .description("Check runtime dependencies")
246
+ .option("--json")
247
+ .action((opts) => {
248
+ const checks = runDoctor();
249
+ printValue(checks, Boolean(opts.json));
250
+ });
251
+ program
252
+ .command("render")
253
+ .description("Print rendered target output to stdout")
254
+ .requiredOption("--pack <packId>")
255
+ .requiredOption("--target <target>")
256
+ .action((opts) => {
257
+ const target = String(opts.target);
258
+ if (!isTargetId(target))
259
+ throw new Error(`Invalid target: ${target}`);
260
+ const pack = loadPack(String(opts.pack));
261
+ process.stdout.write(exportPackToTarget(pack, target));
262
+ });
263
+ program.parseAsync(process.argv).catch((error) => {
264
+ const message = error instanceof Error ? error.message : String(error);
265
+ process.stderr.write(`${message}\n`);
266
+ process.exit(1);
267
+ });
268
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAA0B,MAAM,qBAAqB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAA0C,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAmB,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAIzD,SAAS,QAAQ,CAAC,KAAyB;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,GAAuB;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAoB,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAc;IAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,OAAO,IAAI,SAAS,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,GAAsB;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;SACxC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAC7B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC,CACJ;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/E,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,MAAgB;IACtD,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,MAAe;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,0CAA0C,CAAC;KACvD,cAAc,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KACrD,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;KACvF,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;KAC/E,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,6BAA6B,CAAC;KACrC,MAAM,CAAC,8BAA8B,CAAC;KACtC,MAAM,CAAC,4BAA4B,CAAC;KACpC,MAAM,CAAC,kCAAkC,CAAC;KAC1C,MAAM,CAAC,8BAA8B,CAAC;KACtC,MAAM,CAAC,oCAAoC,CAAC;KAC5C,MAAM,CAAC,0BAA0B,EAAE,sCAAsC,CAAC;KAC1E,MAAM,CAAC,8BAA8B,CAAC;KACtC,MAAM,CAAC,iCAAiC,CAAC;KACzC,MAAM,CAAC,gCAAgC,CAAC;KACxC,MAAM,CAAC,2BAA2B,CAAC;KACnC,MAAM,CAAC,8BAA8B,CAAC;KACtC,MAAM,CAAC,2BAA2B,CAAC;KACnC,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;KACrE,MAAM,CAAC,6BAA6B,EAAE,mCAAmC,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAgB,EAAE,EAAE;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAA6B,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAEzD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;YACvC,QAAQ;YACR,GAAG;YACH,IAAI;YACJ,OAAO,EAAE;gBACP,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;gBAC/C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;gBACnD,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;gBAC/C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;aACtD;YACD,cAAc;YACd,GAAG,EAAE,cAAc;YACnB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;gBACf,IAAI,CAAC,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;YACpD,CAAC;SACF,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,CAAC,CAAC;QAClB,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,CACR;gBACE,MAAM,EAAE,SAAS;gBACjB,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,aAAa;gBAC1B,MAAM,EAAE,MAAM,CAAC,aAAa;gBAC5B,aAAa,EAAE,4BAA4B,MAAM,gBAAgB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;aACvF,EACD,MAAM,CACP,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,UAAU,CACR;QACE,MAAM,EAAE,IAAI;QACZ,MAAM;QACN,SAAS;QACT,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;KACrC,EACD,MAAM,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uCAAuC,CAAC;KACpD,cAAc,CAAC,iBAAiB,CAAC;KACjC,cAAc,CAAC,mBAAmB,CAAC;KACnC,MAAM,CAAC,cAAc,CAAC;KACtB,MAAM,CAAC,WAAW,CAAC;KACnB,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE5D,UAAU,CACR;QACE,MAAM,EAAE,IAAI;QACZ,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;KACjC,EACD,MAAM,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,cAAc,CAAC,iBAAiB,CAAC;KACjC,cAAc,CAAC,mBAAmB,CAAC;KACnC,cAAc,CAAC,eAAe,CAAC;KAC/B,MAAM,CAAC,WAAW,CAAC;KACnB,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAChF,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gBAAgB,CAAC;KAC7B,cAAc,CAAC,iBAAiB,CAAC;KACjC,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,sBAAsB,CAAC;KACnC,cAAc,CAAC,iBAAiB,CAAC;KACjC,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,QAAQ,CAAC;KAChB,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,cAAc,CAAC,iBAAiB,CAAC;KACjC,cAAc,CAAC,mBAAmB,CAAC;KACnC,MAAM,CAAC,CAAC,IAAgB,EAAE,EAAE;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type DoctorCheck = {
2
+ name: string;
3
+ status: "ok" | "warn";
4
+ detail: string;
5
+ };
6
+ export declare function runDoctor(): DoctorCheck[];
@@ -0,0 +1,41 @@
1
+ import fs from "node:fs";
2
+ import { spawnSync } from "node:child_process";
3
+ import { getPaths } from "./paths.js";
4
+ function commandExists(command) {
5
+ const out = spawnSync("sh", ["-c", `command -v ${command}`], { encoding: "utf8" });
6
+ return out.status === 0;
7
+ }
8
+ export function runDoctor() {
9
+ const paths = getPaths();
10
+ fs.mkdirSync(paths.baseDir, { recursive: true });
11
+ fs.mkdirSync(paths.packsDir, { recursive: true });
12
+ fs.mkdirSync(paths.secretsDir, { recursive: true });
13
+ const checks = [];
14
+ checks.push({
15
+ name: "storage",
16
+ status: "ok",
17
+ detail: `Using ${paths.baseDir}`,
18
+ });
19
+ checks.push({
20
+ name: "node",
21
+ status: commandExists("node") ? "ok" : "warn",
22
+ detail: commandExists("node") ? "node is available" : "node is missing",
23
+ });
24
+ checks.push({
25
+ name: "bitwarden-cli",
26
+ status: commandExists("bw") ? "ok" : "warn",
27
+ detail: commandExists("bw") ? "bw is available" : "bw not found (install for live vault operations)",
28
+ });
29
+ checks.push({
30
+ name: "agentmail-api-key",
31
+ status: process.env.AGENTMAIL_API_KEY ? "ok" : "warn",
32
+ detail: process.env.AGENTMAIL_API_KEY ? "AGENTMAIL_API_KEY present" : "AGENTMAIL_API_KEY missing",
33
+ });
34
+ checks.push({
35
+ name: "git",
36
+ status: commandExists("git") ? "ok" : "warn",
37
+ detail: commandExists("git") ? "git is available" : "git is missing",
38
+ });
39
+ return checks;
40
+ }
41
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,cAAc,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,SAAS,KAAK,CAAC,OAAO,EAAE;KACjC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,iBAAiB;KACxE,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC3C,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kDAAkD;KACrG,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACrD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,2BAA2B;KAClG,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC5C,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB;KACrE,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function readJsonFile<T>(filePath: string): T | undefined;
2
+ export declare function writeJsonFile(filePath: string, value: unknown): void;
@@ -0,0 +1,19 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function readJsonFile(filePath) {
4
+ try {
5
+ const raw = fs.readFileSync(filePath, "utf8");
6
+ return JSON.parse(raw);
7
+ }
8
+ catch (error) {
9
+ const err = error;
10
+ if (err.code === "ENOENT")
11
+ return undefined;
12
+ throw error;
13
+ }
14
+ }
15
+ export function writeJsonFile(filePath, value) {
16
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
17
+ fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
18
+ }
19
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/core/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY,CAAI,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IAC5D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { IdentityPack, ProvisioningRunLog, TargetId } from "./types.js";
2
+ export declare function savePack(pack: IdentityPack): IdentityPack;
3
+ export declare function loadPack(packId: string): IdentityPack;
4
+ export declare function listPacks(): string[];
5
+ export declare function ensurePack(packId: string, targets: TargetId[]): IdentityPack;
6
+ export declare function appendProvisioningRun(pack: IdentityPack, run: ProvisioningRunLog): IdentityPack;
@@ -0,0 +1,75 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { readJsonFile, writeJsonFile } from "./fs.js";
4
+ import { getPaths } from "./paths.js";
5
+ import { validatePack } from "./schema.js";
6
+ import { PACK_SCHEMA_VERSION } from "./types.js";
7
+ function packFilePath(packId) {
8
+ return path.join(getPaths().packsDir, `${packId}.json`);
9
+ }
10
+ export function savePack(pack) {
11
+ const validated = validatePack(pack);
12
+ writeJsonFile(packFilePath(validated.packId), validated);
13
+ return validated;
14
+ }
15
+ export function loadPack(packId) {
16
+ const loaded = readJsonFile(packFilePath(packId));
17
+ if (!loaded) {
18
+ throw new Error(`Pack not found: ${packId}`);
19
+ }
20
+ return validatePack(loaded);
21
+ }
22
+ export function listPacks() {
23
+ const { packsDir } = getPaths();
24
+ try {
25
+ return fs
26
+ .readdirSync(packsDir)
27
+ .filter((f) => f.endsWith(".json"))
28
+ .map((f) => f.replace(/\.json$/, ""))
29
+ .sort();
30
+ }
31
+ catch (error) {
32
+ const err = error;
33
+ if (err.code === "ENOENT")
34
+ return [];
35
+ throw error;
36
+ }
37
+ }
38
+ export function ensurePack(packId, targets) {
39
+ try {
40
+ const existing = loadPack(packId);
41
+ if (!targets.length)
42
+ return existing;
43
+ const merged = {
44
+ ...existing,
45
+ targets,
46
+ updatedAt: new Date().toISOString(),
47
+ };
48
+ return savePack(merged);
49
+ }
50
+ catch {
51
+ const now = new Date().toISOString();
52
+ return savePack({
53
+ schema: PACK_SCHEMA_VERSION,
54
+ packId,
55
+ createdAt: now,
56
+ updatedAt: now,
57
+ accounts: {},
58
+ targets,
59
+ provisioning: {
60
+ runs: [],
61
+ },
62
+ });
63
+ }
64
+ }
65
+ export function appendProvisioningRun(pack, run) {
66
+ const next = {
67
+ ...pack,
68
+ updatedAt: new Date().toISOString(),
69
+ provisioning: {
70
+ runs: [...(pack.provisioning?.runs || []), run],
71
+ },
72
+ };
73
+ return savePack(next);
74
+ }
75
+ //# sourceMappingURL=packs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.js","sourceRoot":"","sources":["../../src/core/packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAkB;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,MAAM,GAAG,YAAY,CAAe,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,EAAE;aACN,WAAW,CAAC,QAAQ,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;aACpC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,OAAmB;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QACrC,MAAM,MAAM,GAAG;YACb,GAAG,QAAQ;YACX,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC;YACd,MAAM,EAAE,mBAAmB;YAC3B,MAAM;YACN,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,EAAE;YACZ,OAAO;YACP,YAAY,EAAE;gBACZ,IAAI,EAAE,EAAE;aACT;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAkB,EAAE,GAAuB;IAC/E,MAAM,IAAI,GAAiB;QACzB,GAAG,IAAI;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE;YACZ,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC;SAChD;KACF,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type OneClawPaths = {
2
+ baseDir: string;
3
+ packsDir: string;
4
+ secretsDir: string;
5
+ };
6
+ export declare function getPaths(): OneClawPaths;
@@ -0,0 +1,11 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function getPaths() {
4
+ const baseDir = process.env.ONECLAW_HOME?.trim() || path.join(os.homedir(), ".oneclaw");
5
+ return {
6
+ baseDir,
7
+ packsDir: path.join(baseDir, "packs"),
8
+ secretsDir: path.join(baseDir, "secrets"),
9
+ };
10
+ }
11
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,UAAU,QAAQ;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACxF,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export type StepKind = "api_call" | "browser_task" | "manual_checkpoint" | "verify" | "persist_secret";
2
+ export type ProviderStepState = {
3
+ stepId: string;
4
+ kind: StepKind;
5
+ status: "completed" | "blocked";
6
+ detail: string;
7
+ updatedAt: string;
8
+ };
9
+ export type ProviderRunState = {
10
+ cursor: number;
11
+ completed: boolean;
12
+ data: Record<string, string>;
13
+ steps: ProviderStepState[];
14
+ };
15
+ export type ProvisionRunState = {
16
+ packId: string;
17
+ runId: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ providers: Record<string, ProviderRunState>;
21
+ };
22
+ export declare function loadRunState(packId: string): ProvisionRunState | undefined;
23
+ export declare function createRunState(packId: string): ProvisionRunState;
24
+ export declare function saveRunState(state: ProvisionRunState): void;
25
+ export declare function clearRunState(packId: string): void;
@@ -0,0 +1,34 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { readJsonFile, writeJsonFile } from "./fs.js";
4
+ import { getPaths } from "./paths.js";
5
+ function runStatePath(packId) {
6
+ return path.join(getPaths().baseDir, "runs", `${packId}.json`);
7
+ }
8
+ export function loadRunState(packId) {
9
+ return readJsonFile(runStatePath(packId));
10
+ }
11
+ export function createRunState(packId) {
12
+ const now = new Date().toISOString();
13
+ return {
14
+ packId,
15
+ runId: `${packId}-${Date.now()}`,
16
+ createdAt: now,
17
+ updatedAt: now,
18
+ providers: {},
19
+ };
20
+ }
21
+ export function saveRunState(state) {
22
+ state.updatedAt = new Date().toISOString();
23
+ writeJsonFile(runStatePath(state.packId), state);
24
+ }
25
+ export function clearRunState(packId) {
26
+ const filePath = runStatePath(packId);
27
+ try {
28
+ fs.unlinkSync(filePath);
29
+ }
30
+ catch {
31
+ // no-op if absent
32
+ }
33
+ }
34
+ //# sourceMappingURL=run-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/core/run-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2BtC,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,YAAY,CAAoB,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,MAAM;QACN,KAAK,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;QAChC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;AACH,CAAC"}