@adhamalkhaja/seyola-runtime 0.11.21 → 0.12.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.
@@ -0,0 +1,370 @@
1
+ /**
2
+ * seyola-runtime support-bundle — export a redacted diagnostic bundle for support.
3
+ *
4
+ * Always opt-in: never runs automatically. The member explicitly invokes
5
+ *
6
+ * seyola-runtime support-bundle --workspace .
7
+ *
8
+ * and the output lands at
9
+ *
10
+ * <workspace>/support-bundles/<UTC-timestamp>/
11
+ *
12
+ * with both the redacted snapshot and an INDEX.md the member can review before
13
+ * sending to support.
14
+ *
15
+ * --safe (default): minimal diagnostics with stricter redaction. State files
16
+ * are NOT included by default in --safe mode. .seyola/backups/
17
+ * are NEVER included.
18
+ *
19
+ * --full: includes redacted state files. Use only when explicitly diagnosing a
20
+ * state-machine bug. Still excludes business-data dirs and .seyola/backups/.
21
+ *
22
+ * What --safe always includes:
23
+ * - version.json (verbatim — already public info)
24
+ * - doctor.json (rerun doctor at export time; output captured)
25
+ * - skills.txt (list of installed skill folder names)
26
+ * - dirs.txt (which member-owned dirs exist, file counts only)
27
+ * - settings-deny-count.txt (count of deny patterns in settings.json, not contents)
28
+ * - hashes.txt (SHA256 of CLAUDE.md, registry files; useful for drift detection)
29
+ *
30
+ * What --full adds (over --safe):
31
+ * - state/atlas-state.md (redacted)
32
+ * - state/daily-rhythm.yaml (redacted)
33
+ * - state/client-goal.md (redacted, plus prospect names scrubbed)
34
+ * - state/first-client-path.md (redacted)
35
+ *
36
+ * What gets redacted (in any included file):
37
+ * - Email addresses
38
+ * - Phone numbers
39
+ * - API keys (OpenAI, Anthropic, GitHub, AWS, Stripe)
40
+ * - PEM blocks
41
+ * - Bearer tokens in URLs
42
+ * - Prospect / client names that look like proper-noun pairs
43
+ *
44
+ * What never goes in (in any mode):
45
+ * - .env file contents
46
+ * - secrets/ folder contents
47
+ * - credentials/ folder contents
48
+ * - Anything under .ssh
49
+ * - .git internals
50
+ * - .seyola/backups/ (prior CLAUDE.md versions may carry stale guidance or local edits)
51
+ * - Skill output that lives under self/, _foundations/, market/, offer/, offers/, clients/,
52
+ * content/, email/, commercial-surface/, outreach/, runs/, output/, outputs/, assets/
53
+ * (these contain real business data and stay local).
54
+ */
55
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from "node:fs";
56
+ import { createHash } from "node:crypto";
57
+ import { join, resolve } from "node:path";
58
+ import { runDoctor } from "../doctor/index.js";
59
+ const REDACTIONS = [
60
+ // Email — common shapes
61
+ {
62
+ label: "email",
63
+ pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,
64
+ replacement: "[REDACTED:email]",
65
+ },
66
+ // Phone — international and local-ish patterns. Conservative: matches +country + digits.
67
+ {
68
+ label: "phone",
69
+ pattern: /\+\d{1,3}[\s-]?\(?\d{1,4}\)?[\s-]?\d{3,4}[\s-]?\d{3,4}/g,
70
+ replacement: "[REDACTED:phone]",
71
+ },
72
+ // OpenAI-style keys
73
+ {
74
+ label: "openai-key",
75
+ pattern: /\bsk-(proj-)?[A-Za-z0-9]{20,}\b/g,
76
+ replacement: "[REDACTED:openai-key]",
77
+ },
78
+ // Anthropic-style keys
79
+ {
80
+ label: "anthropic-key",
81
+ pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g,
82
+ replacement: "[REDACTED:anthropic-key]",
83
+ },
84
+ // GitHub personal-access tokens
85
+ {
86
+ label: "github-token",
87
+ pattern: /\bgh[pousr]_[A-Za-z0-9]{20,}\b/g,
88
+ replacement: "[REDACTED:github-token]",
89
+ },
90
+ // AWS access keys
91
+ {
92
+ label: "aws-access-key",
93
+ pattern: /\bAKIA[0-9A-Z]{16}\b/g,
94
+ replacement: "[REDACTED:aws-access-key]",
95
+ },
96
+ // Generic bearer tokens in URLs
97
+ {
98
+ label: "bearer-token",
99
+ pattern: /\b(bearer\s+|token=|api[_-]?key=)([A-Za-z0-9_-]{20,})/gi,
100
+ replacement: "$1[REDACTED:token]",
101
+ },
102
+ // PEM blocks
103
+ {
104
+ label: "pem-block",
105
+ pattern: /-----BEGIN [A-Z ]+-----[\s\S]*?-----END [A-Z ]+-----/g,
106
+ replacement: "[REDACTED:pem-block]",
107
+ },
108
+ // Stripe-style keys
109
+ {
110
+ label: "stripe-key",
111
+ pattern: /\b(sk|pk|rk)_(live|test)_[A-Za-z0-9]{20,}\b/g,
112
+ replacement: "[REDACTED:stripe-key]",
113
+ },
114
+ ];
115
+ function redact(text, counter) {
116
+ let out = text;
117
+ for (const r of REDACTIONS) {
118
+ const matches = out.match(r.pattern);
119
+ if (matches)
120
+ counter.count += matches.length;
121
+ out = out.replace(r.pattern, r.replacement);
122
+ }
123
+ return out;
124
+ }
125
+ // ---------------------------------------------------------------------------
126
+ // Member-owned dirs that we count files in (but do NOT export contents).
127
+ // Kept in sync with the canonical MEMBER_OWNED_DIRS in bundle/index.ts.
128
+ // ---------------------------------------------------------------------------
129
+ const COUNTED_MEMBER_DIRS = [
130
+ "_foundations",
131
+ "self",
132
+ "runtime",
133
+ "market",
134
+ "clients",
135
+ "runs",
136
+ "output",
137
+ "outputs",
138
+ "offer",
139
+ "offers",
140
+ "content",
141
+ "email",
142
+ "commercial-surface",
143
+ "outreach",
144
+ "assets",
145
+ ];
146
+ // State files we DO export (redacted). These are member state, not business data.
147
+ const EXPORTED_STATE_FILES = [
148
+ "runtime/atlas-state.md",
149
+ "runtime/daily-rhythm.yaml",
150
+ "runtime/client-goal.md",
151
+ "runtime/first-client-path.md",
152
+ ];
153
+ // ---------------------------------------------------------------------------
154
+ // Entry
155
+ // ---------------------------------------------------------------------------
156
+ export async function runSupportBundle(args) {
157
+ const start = Date.now();
158
+ const ws = resolve(args.workspacePath);
159
+ const mode = args.mode ?? "safe";
160
+ const result = {
161
+ exitCode: 0,
162
+ status: "success",
163
+ workspace_path: ws,
164
+ output_path: "",
165
+ files_written: [],
166
+ redactions_applied: 0,
167
+ duration_ms: 0,
168
+ errors: [],
169
+ };
170
+ if (!existsSync(ws) || !statSync(ws).isDirectory()) {
171
+ result.exitCode = 1;
172
+ result.status = "failed";
173
+ result.errors.push({ code: "workspace_not_found", message: `--workspace '${ws}' does not exist or is not a directory.` });
174
+ return finalize(result, start, args);
175
+ }
176
+ // Output directory: support-bundles/<UTC-timestamp>/
177
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
178
+ const outDir = join(ws, "support-bundles", stamp);
179
+ mkdirSync(outDir, { recursive: true });
180
+ result.output_path = outDir;
181
+ const counter = { count: 0 };
182
+ // 1. version.json — verbatim
183
+ const versionPath = join(ws, ".seyola", "version.json");
184
+ if (existsSync(versionPath)) {
185
+ const versionText = readFileSync(versionPath, "utf8");
186
+ writeFileSync(join(outDir, "version.json"), versionText, "utf8");
187
+ result.files_written.push("version.json");
188
+ }
189
+ else {
190
+ result.errors.push({ code: "version_missing", message: ".seyola/version.json not found." });
191
+ }
192
+ // 2. doctor output — fresh capture
193
+ try {
194
+ const doctorResult = await runDoctor({ workspacePath: ws, json: true });
195
+ writeFileSync(join(outDir, "doctor.json"), JSON.stringify(doctorResult, null, 2) + "\n", "utf8");
196
+ result.files_written.push("doctor.json");
197
+ }
198
+ catch (err) {
199
+ result.errors.push({ code: "doctor_failed", message: err.message });
200
+ }
201
+ // 3. skills.txt — list installed skill folder names
202
+ const skillsDir = join(ws, ".claude", "skills");
203
+ if (existsSync(skillsDir)) {
204
+ const skillNames = readdirSync(skillsDir)
205
+ .filter((name) => statSync(join(skillsDir, name)).isDirectory())
206
+ .sort();
207
+ writeFileSync(join(outDir, "skills.txt"), `# Installed skills (${skillNames.length} total)\n` + skillNames.join("\n") + "\n", "utf8");
208
+ result.files_written.push("skills.txt");
209
+ }
210
+ // 4. dirs.txt — file counts per member-owned directory
211
+ const dirRows = ["# Member-owned directory file counts", ""];
212
+ for (const dir of COUNTED_MEMBER_DIRS) {
213
+ const abs = join(ws, dir);
214
+ if (existsSync(abs) && statSync(abs).isDirectory()) {
215
+ const count = countFiles(abs);
216
+ dirRows.push(`${dir}/ ${count} file${count === 1 ? "" : "s"}`);
217
+ }
218
+ else {
219
+ dirRows.push(`${dir}/ MISSING`);
220
+ }
221
+ }
222
+ writeFileSync(join(outDir, "dirs.txt"), dirRows.join("\n") + "\n", "utf8");
223
+ result.files_written.push("dirs.txt");
224
+ // 5. hashes.txt — integrity fingerprints for drift detection across reports.
225
+ // SHA256 only, never content.
226
+ const hashedPaths = [
227
+ ".seyola/version.json",
228
+ "CLAUDE.md",
229
+ ".seyola/pack/architecture/skill-registry.yaml",
230
+ ".seyola/pack/architecture/artifact-registry.yaml",
231
+ ".seyola/pack/architecture/day-graph.yaml",
232
+ ".seyola/pack/policies/gates.md",
233
+ ".claude/settings.json",
234
+ ];
235
+ const hashLines = ["# SHA256 fingerprints (for drift detection only)", ""];
236
+ for (const rel of hashedPaths) {
237
+ const abs = join(ws, rel);
238
+ if (existsSync(abs) && statSync(abs).isFile()) {
239
+ const content = readFileSync(abs);
240
+ const hash = createHash("sha256").update(content).digest("hex");
241
+ hashLines.push(`${hash} ${rel}`);
242
+ }
243
+ else {
244
+ hashLines.push(`MISSING ${rel}`);
245
+ }
246
+ }
247
+ writeFileSync(join(outDir, "hashes.txt"), hashLines.join("\n") + "\n", "utf8");
248
+ result.files_written.push("hashes.txt");
249
+ // 6. settings-deny-count.txt — count of deny patterns, not contents.
250
+ const settingsPath = join(ws, ".claude", "settings.json");
251
+ let denyCount = 0;
252
+ if (existsSync(settingsPath)) {
253
+ try {
254
+ const settings = JSON.parse(readFileSync(settingsPath, "utf8"));
255
+ denyCount = settings.permissions?.deny?.length ?? 0;
256
+ }
257
+ catch {
258
+ denyCount = -1; // parse failure
259
+ }
260
+ }
261
+ writeFileSync(join(outDir, "settings-deny-count.txt"), `# .claude/settings.json deny-rule count\n${denyCount}\n`, "utf8");
262
+ result.files_written.push("settings-deny-count.txt");
263
+ // 7. state files — only in --full mode. --safe (default) excludes these because they
264
+ // can contain prospect names, locked niches, dates, and other context that should not
265
+ // leave the workspace unless the member explicitly asks.
266
+ if (mode === "full") {
267
+ const stateDir = join(outDir, "state");
268
+ mkdirSync(stateDir, { recursive: true });
269
+ for (const rel of EXPORTED_STATE_FILES) {
270
+ const src = join(ws, rel);
271
+ if (!existsSync(src))
272
+ continue;
273
+ try {
274
+ const content = readFileSync(src, "utf8");
275
+ const redacted = redact(content, counter);
276
+ const destName = rel.replace(/[\\/]/g, "__");
277
+ writeFileSync(join(stateDir, destName), redacted, "utf8");
278
+ result.files_written.push(`state/${destName}`);
279
+ }
280
+ catch (err) {
281
+ result.errors.push({ code: "state_read_failed", message: `Could not read ${rel}: ${err.message}` });
282
+ }
283
+ }
284
+ }
285
+ result.redactions_applied = counter.count;
286
+ // .seyola/backups/ is NEVER included regardless of mode. Prior CLAUDE.md versions
287
+ // may carry stale guidance or local edits the member made and forgot. If a member
288
+ // needs to share a specific backup, they can copy it into the support folder
289
+ // manually after reading it.
290
+ // 8. INDEX.md — describes what is in the bundle
291
+ const indexLines = [
292
+ `# Support Bundle — ${stamp}`,
293
+ "",
294
+ `Workspace: ${ws}`,
295
+ `Generated: ${new Date().toISOString()}`,
296
+ `Mode: ${mode}`,
297
+ `Redactions applied: ${result.redactions_applied}`,
298
+ "",
299
+ "## Files included",
300
+ "",
301
+ ...result.files_written.map((f) => `- ${f}`),
302
+ "",
303
+ "## What is NOT included",
304
+ "",
305
+ "- Contents of `_foundations/`, `self/`, `market/`, `offer/`, `offers/`, `clients/`, `content/`,",
306
+ " `email/`, `commercial-surface/`, `outreach/`, `assets/`, `output/`, `outputs/`, `runs/`",
307
+ " (business data; counted but not exported)",
308
+ "- `.env`, `secrets/`, `credentials/`, `.ssh/`, `.git/` (never read by this command)",
309
+ "- `.seyola/backups/` (never included regardless of mode; prior CLAUDE.md versions may carry stale guidance or local edits)",
310
+ "- Skill output files (business data)",
311
+ mode === "safe"
312
+ ? "- State files (atlas-state, daily-rhythm, client-goal, first-client-path) — `safe` mode default. Use `--mode full` to include them as redacted copies."
313
+ : "- `safe` mode would also exclude state files. You ran with `--mode full`, so redacted state files ARE in this bundle.",
314
+ "",
315
+ "## Redaction policy applied to state files",
316
+ "",
317
+ "- Email addresses → `[REDACTED:email]`",
318
+ "- Phone numbers → `[REDACTED:phone]`",
319
+ "- API keys (OpenAI, Anthropic, GitHub, AWS, Stripe) → `[REDACTED:<type>]`",
320
+ "- PEM blocks → `[REDACTED:pem-block]`",
321
+ "- Bearer tokens in URLs → `[REDACTED:token]`",
322
+ "",
323
+ "## How to share with support",
324
+ "",
325
+ "1. Open this folder. Verify there is nothing sensitive remaining in the included files.",
326
+ "2. Zip the folder.",
327
+ "3. Send the zip to support via the channel the operator named (Skool, email, or the support form).",
328
+ "",
329
+ "If you spot anything that should not be shared, edit it out before zipping. The runtime cannot redact context it does not recognize.",
330
+ "",
331
+ ];
332
+ writeFileSync(join(outDir, "INDEX.md"), indexLines.join("\n"), "utf8");
333
+ result.files_written.push("INDEX.md");
334
+ return finalize(result, start, args);
335
+ }
336
+ function countFiles(dir) {
337
+ let count = 0;
338
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
339
+ if (entry.name === ".gitkeep")
340
+ continue;
341
+ if (entry.isFile())
342
+ count += 1;
343
+ else if (entry.isDirectory())
344
+ count += countFiles(join(dir, entry.name));
345
+ }
346
+ return count;
347
+ }
348
+ function finalize(result, start, args) {
349
+ result.duration_ms = Date.now() - start;
350
+ if (args.json) {
351
+ process.stdout.write(JSON.stringify(result, null, 2) + "\n");
352
+ }
353
+ else {
354
+ if (result.status === "success") {
355
+ process.stderr.write(`Support bundle written to ${result.output_path}\n`);
356
+ process.stderr.write(` files: ${result.files_written.length}\n`);
357
+ process.stderr.write(` redactions applied: ${result.redactions_applied}\n`);
358
+ process.stderr.write(` duration: ${result.duration_ms}ms\n`);
359
+ process.stderr.write(`\nReview INDEX.md inside the folder before sharing.\n`);
360
+ }
361
+ else {
362
+ process.stderr.write(`Support bundle FAILED.\n`);
363
+ for (const err of result.errors) {
364
+ process.stderr.write(` [${err.code}] ${err.message}\n`);
365
+ }
366
+ }
367
+ }
368
+ return result;
369
+ }
370
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/support-bundle/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAkC/C,MAAM,UAAU,GAAgB;IAC9B,wBAAwB;IACxB;QACE,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,qDAAqD;QAC9D,WAAW,EAAE,kBAAkB;KAChC;IACD,yFAAyF;IACzF;QACE,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,yDAAyD;QAClE,WAAW,EAAE,kBAAkB;KAChC;IACD,oBAAoB;IACpB;QACE,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EAAE,uBAAuB;KACrC;IACD,uBAAuB;IACvB;QACE,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,0BAA0B;KACxC;IACD,gCAAgC;IAChC;QACE,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE,yBAAyB;KACvC;IACD,kBAAkB;IAClB;QACE,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,uBAAuB;QAChC,WAAW,EAAE,2BAA2B;KACzC;IACD,gCAAgC;IAChC;QACE,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,yDAAyD;QAClE,WAAW,EAAE,oBAAoB;KAClC;IACD,aAAa;IACb;QACE,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,uDAAuD;QAChE,WAAW,EAAE,sBAAsB;KACpC;IACD,oBAAoB;IACpB;QACE,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,8CAA8C;QACvD,WAAW,EAAE,uBAAuB;KACrC;CACF,CAAC;AAMF,SAAS,MAAM,CAAC,IAAY,EAAE,OAAsB;IAClD,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QAC7C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,yEAAyE;AACzE,wEAAwE;AACxE,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG;IAC1B,cAAc;IACd,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,oBAAoB;IACpB,UAAU;IACV,QAAQ;CACT,CAAC;AAEF,kFAAkF;AAClF,MAAM,oBAAoB,GAAG;IAC3B,wBAAwB;IACxB,2BAA2B;IAC3B,wBAAwB;IACxB,8BAA8B;CAC/B,CAAC;AAEF,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAyB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;IAEjC,MAAM,MAAM,GAAwB;QAClC,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,SAAS;QACjB,cAAc,EAAE,EAAE;QAClB,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;QACjB,kBAAkB,EAAE,CAAC;QACrB,WAAW,EAAE,CAAC;QACd,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,EAAE,yCAAyC,EAAE,CAAC,CAAC;QAC1H,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,qDAAqD;IACrD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAClD,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAE5B,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAE5C,6BAA6B;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACjE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAC3B,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC5C,MAAM,CACP,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,oDAAoD;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC/D,IAAI,EAAE,CAAC;QACV,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1B,uBAAuB,UAAU,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAClF,MAAM,CACP,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAa,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEtC,6EAA6E;IAC7E,8BAA8B;IAC9B,MAAM,WAAW,GAAG;QAClB,sBAAsB;QACtB,WAAW;QACX,+CAA+C;QAC/C,kDAAkD;QAClD,0CAA0C;QAC1C,gCAAgC;QAChC,uBAAuB;KACxB,CAAC;IACF,MAAM,SAAS,GAAa,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChE,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,sEAAsE,GAAG,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAExC,qEAAqE;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAA2C,CAAC;YAC1G,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAClC,CAAC;IACH,CAAC;IACD,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,EACvC,4CAA4C,SAAS,IAAI,EACzD,MAAM,CACP,CAAC;IACF,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAErD,qFAAqF;IACrF,sFAAsF;IACtF,yDAAyD;IACzD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC7C,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IAE1C,kFAAkF;IAClF,kFAAkF;IAClF,6EAA6E;IAC7E,6BAA6B;IAE7B,gDAAgD;IAChD,MAAM,UAAU,GAAG;QACjB,sBAAsB,KAAK,EAAE;QAC7B,EAAE;QACF,cAAc,EAAE,EAAE;QAClB,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACxC,SAAS,IAAI,EAAE;QACf,uBAAuB,MAAM,CAAC,kBAAkB,EAAE;QAClD,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,EAAE;QACF,yBAAyB;QACzB,EAAE;QACF,iGAAiG;QACjG,2FAA2F;QAC3F,6CAA6C;QAC7C,qFAAqF;QACrF,4HAA4H;QAC5H,sCAAsC;QACtC,IAAI,KAAK,MAAM;YACb,CAAC,CAAC,wJAAwJ;YAC1J,CAAC,CAAC,uHAAuH;QAC3H,EAAE;QACF,4CAA4C;QAC5C,EAAE;QACF,wCAAwC;QACxC,sCAAsC;QACtC,2EAA2E;QAC3E,uCAAuC;QACvC,8CAA8C;QAC9C,EAAE;QACF,8BAA8B;QAC9B,EAAE;QACF,yFAAyF;QACzF,oBAAoB;QACpB,oGAAoG;QACpG,EAAE;QACF,sIAAsI;QACtI,EAAE;KACH,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;aAC1B,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAA2B,EAAE,KAAa,EAAE,IAAyB;IACrF,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;YAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;YAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,kBAAkB,IAAI,CAAC,CAAC;YAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,WAAW,MAAM,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhamalkhaja/seyola-runtime",
3
- "version": "0.11.21",
3
+ "version": "0.12.1",
4
4
  "description": "Local CLI runtime for the Seyola business operating system. Reads contracts from a Seyola pack and executes them against a runtime backend (claude-code-local).",
5
5
  "keywords": [
6
6
  "seyola",