@zenalexa/unicli 0.207.1 → 0.209.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/AGENTS.md +4 -4
- package/README.md +30 -17
- package/dist/browser/observe.d.ts +80 -0
- package/dist/browser/observe.d.ts.map +1 -0
- package/dist/browser/observe.js +144 -0
- package/dist/browser/observe.js.map +1 -0
- package/dist/browser/snapshot.d.ts.map +1 -1
- package/dist/browser/snapshot.js +29 -9
- package/dist/browser/snapshot.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +82 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/eval.d.ts +112 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +485 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +20 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/hub.d.ts +13 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +232 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +135 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/operate.d.ts.map +1 -1
- package/dist/commands/operate.js +66 -1
- package/dist/commands/operate.js.map +1 -1
- package/dist/commands/research.d.ts +17 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +257 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/skills.d.ts +91 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +266 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/test-gen.d.ts +10 -0
- package/dist/commands/test-gen.d.ts.map +1 -0
- package/dist/commands/test-gen.js +124 -0
- package/dist/commands/test-gen.js.map +1 -0
- package/dist/commands/usage.d.ts +17 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +87 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/discovery/loader.d.ts +8 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +103 -6
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/capability.d.ts +40 -0
- package/dist/engine/capability.d.ts.map +1 -0
- package/dist/engine/capability.js +191 -0
- package/dist/engine/capability.js.map +1 -0
- package/dist/engine/endpoint.d.ts +47 -0
- package/dist/engine/endpoint.d.ts.map +1 -0
- package/dist/engine/endpoint.js +295 -0
- package/dist/engine/endpoint.js.map +1 -0
- package/dist/engine/framework.d.ts +28 -0
- package/dist/engine/framework.d.ts.map +1 -0
- package/dist/engine/framework.js +66 -0
- package/dist/engine/framework.js.map +1 -0
- package/dist/engine/probe.d.ts +19 -0
- package/dist/engine/probe.d.ts.map +1 -0
- package/dist/engine/probe.js +85 -0
- package/dist/engine/probe.js.map +1 -0
- package/dist/engine/research.d.ts +38 -0
- package/dist/engine/research.d.ts.map +1 -0
- package/dist/engine/research.js +414 -0
- package/dist/engine/research.js.map +1 -0
- package/dist/engine/update-check.js +1 -1
- package/dist/engine/update-check.js.map +1 -1
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +115 -6
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/main.d.ts +1 -4
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -4
- package/dist/main.js.map +1 -1
- package/dist/manifest.json +519 -1
- package/dist/mcp/server.d.ts +19 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +459 -115
- package/dist/mcp/server.js.map +1 -1
- package/dist/permissions/sensitive-paths.d.ts +92 -0
- package/dist/permissions/sensitive-paths.d.ts.map +1 -0
- package/dist/permissions/sensitive-paths.js +174 -0
- package/dist/permissions/sensitive-paths.js.map +1 -0
- package/dist/runtime/usage-ledger.d.ts +86 -0
- package/dist/runtime/usage-ledger.d.ts.map +1 -0
- package/dist/runtime/usage-ledger.js +173 -0
- package/dist/runtime/usage-ledger.js.map +1 -0
- package/package.json +8 -7
- package/src/adapters/autoagent/eval-run.yaml +36 -0
- package/src/adapters/cnn/top.yaml +21 -0
- package/src/adapters/cocoapods/search.yaml +16 -0
- package/src/adapters/crates-io/search.yaml +27 -0
- package/src/adapters/cua/bench-list.yaml +20 -0
- package/src/adapters/cua/bench-run.yaml +32 -0
- package/src/adapters/docker-hub/search.yaml +26 -0
- package/src/adapters/eastmoney/hot.yaml +23 -0
- package/src/adapters/eastmoney/search.yaml +25 -0
- package/src/adapters/exchangerate/convert.yaml +19 -0
- package/src/adapters/feishu/calendar.yaml +24 -0
- package/src/adapters/feishu/docs.yaml +17 -0
- package/src/adapters/feishu/send.yaml +29 -0
- package/src/adapters/feishu/tasks.yaml +24 -0
- package/src/adapters/gitee/search.yaml +25 -0
- package/src/adapters/gitee/trending.yaml +22 -0
- package/src/adapters/gitlab/search.yaml +24 -0
- package/src/adapters/gitlab/trending.yaml +22 -0
- package/src/adapters/godot/project-run.yaml +31 -0
- package/src/adapters/godot/scene-export.yaml +39 -0
- package/src/adapters/hermes/sessions-search.yaml +61 -0
- package/src/adapters/hermes/skills-list.yaml +30 -0
- package/src/adapters/hermes/skills-read.yaml +46 -0
- package/src/adapters/homebrew/info.yaml +15 -0
- package/src/adapters/huggingface-papers/daily.yaml +21 -0
- package/src/adapters/infoq/articles.yaml +29 -0
- package/src/adapters/ip-info/lookup.yaml +15 -0
- package/src/adapters/itch-io/popular.yaml +22 -0
- package/src/adapters/ithome/news.yaml +21 -0
- package/src/adapters/mastodon/search.yaml +29 -0
- package/src/adapters/mastodon/trending.yaml +27 -0
- package/src/adapters/meituan/search.yaml +30 -0
- package/src/adapters/minimax/chat.yaml +33 -0
- package/src/adapters/minimax/models.yaml +18 -0
- package/src/adapters/minimax/tts.yaml +33 -0
- package/src/adapters/motion-studio/component-get.yaml +35 -0
- package/src/adapters/netease-music/hot.yaml +24 -0
- package/src/adapters/netease-music/search.yaml +29 -0
- package/src/adapters/npm-trends/compare.yaml +19 -0
- package/src/adapters/nytimes/top.yaml +26 -0
- package/src/adapters/openharness/memory-read.yaml +51 -0
- package/src/adapters/openharness/skills-list.yaml +28 -0
- package/src/adapters/openrouter/models.yaml +22 -0
- package/src/adapters/pexels/search.yaml +28 -0
- package/src/adapters/pinduoduo/hot.yaml +20 -0
- package/src/adapters/pypi/info.yaml +16 -0
- package/src/adapters/qweather/now.yaml +16 -0
- package/src/adapters/renderdoc/capture-list.yaml +42 -0
- package/src/adapters/renderdoc/frame-export.yaml +32 -0
- package/src/adapters/replicate/search.yaml +25 -0
- package/src/adapters/replicate/trending.yaml +22 -0
- package/src/adapters/sspai/hot.yaml +21 -0
- package/src/adapters/sspai/latest.yaml +22 -0
- package/src/adapters/stagehand/wrap-observe.yaml +42 -0
- package/src/adapters/techcrunch/latest.yaml +22 -0
- package/src/adapters/theverge/latest.yaml +21 -0
- package/src/adapters/twitch/top.yaml +26 -0
- package/src/adapters/unsplash/search.yaml +28 -0
- package/src/adapters/ycombinator/launches.yaml +20 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Probing — click elements to trigger API calls.
|
|
3
|
+
*
|
|
4
|
+
* Uses accessibility tree snapshot for smart element selection,
|
|
5
|
+
* with role-aware filtering and dangerous element avoidance.
|
|
6
|
+
*/
|
|
7
|
+
import type { IPage } from "../types.js";
|
|
8
|
+
export interface ProbeOptions {
|
|
9
|
+
maxClicks?: number;
|
|
10
|
+
delayMs?: number;
|
|
11
|
+
labels?: string[];
|
|
12
|
+
roles?: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface ProbeResult {
|
|
15
|
+
clicked: number;
|
|
16
|
+
labels: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function probeInteractive(page: IPage, opts?: ProbeOptions): Promise<ProbeResult>;
|
|
19
|
+
//# sourceMappingURL=probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/engine/probe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAOD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,KAAK,EACX,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,WAAW,CAAC,CAmFtB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive Probing — click elements to trigger API calls.
|
|
3
|
+
*
|
|
4
|
+
* Uses accessibility tree snapshot for smart element selection,
|
|
5
|
+
* with role-aware filtering and dangerous element avoidance.
|
|
6
|
+
*/
|
|
7
|
+
const SKIP_PATTERNS = /登录|注册|login|sign.?in|sign.?up|close|关闭|下载.?app|download.?app|cookie|privacy|install/i;
|
|
8
|
+
const PREFER_PATTERNS = /更多|热门|推荐|全部|more|all|popular|trending|hot|load.?more|show.?more|expand/i;
|
|
9
|
+
export async function probeInteractive(page, opts) {
|
|
10
|
+
const maxClicks = opts?.maxClicks ?? 12;
|
|
11
|
+
const delayMs = opts?.delayMs ?? 400;
|
|
12
|
+
const preferredRoles = opts?.roles ?? ["tab", "button", "link"];
|
|
13
|
+
const clicked = [];
|
|
14
|
+
// Step 1: Targeted label clicks
|
|
15
|
+
if (opts?.labels?.length) {
|
|
16
|
+
for (const label of opts.labels) {
|
|
17
|
+
try {
|
|
18
|
+
const safeLabel = JSON.stringify(label);
|
|
19
|
+
await page.evaluate(`(() => {
|
|
20
|
+
const el = [...document.querySelectorAll('button, [role="button"], [role="tab"], a, span')]
|
|
21
|
+
.find(e => e.textContent && e.textContent.trim().includes(${safeLabel}));
|
|
22
|
+
if (el) el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
|
|
23
|
+
})()`);
|
|
24
|
+
clicked.push(label);
|
|
25
|
+
await page.wait(delayMs / 1000);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* label not found */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (clicked.length >= maxClicks) {
|
|
33
|
+
return { clicked: clicked.length, labels: clicked };
|
|
34
|
+
}
|
|
35
|
+
// Step 2: Snapshot-based probing
|
|
36
|
+
try {
|
|
37
|
+
const snap = await page.snapshot({ interactive: true, compact: true });
|
|
38
|
+
// Parse interactive refs from snapshot text
|
|
39
|
+
// Format: [ref=N] tag "text" or [N] text
|
|
40
|
+
const refPattern = /\[(?:ref=)?(\d+)\]\s*(\w+)?\s*"?([^"\n]*)"?/g;
|
|
41
|
+
const refs = [];
|
|
42
|
+
let match;
|
|
43
|
+
while ((match = refPattern.exec(snap)) !== null) {
|
|
44
|
+
refs.push({ ref: match[1], tag: match[2] ?? "", text: match[3] ?? "" });
|
|
45
|
+
}
|
|
46
|
+
// Filter and rank
|
|
47
|
+
const candidates = refs
|
|
48
|
+
.filter((r) => !SKIP_PATTERNS.test(r.text))
|
|
49
|
+
.filter((r) => r.text.trim().length > 0)
|
|
50
|
+
.sort((a, b) => {
|
|
51
|
+
const aPrefer = PREFER_PATTERNS.test(a.text) ? -1 : 0;
|
|
52
|
+
const bPrefer = PREFER_PATTERNS.test(b.text) ? -1 : 0;
|
|
53
|
+
if (aPrefer !== bPrefer)
|
|
54
|
+
return aPrefer - bPrefer;
|
|
55
|
+
const aRole = preferredRoles.indexOf(a.tag.toLowerCase());
|
|
56
|
+
const bRole = preferredRoles.indexOf(b.tag.toLowerCase());
|
|
57
|
+
const aIdx = aRole >= 0 ? aRole : preferredRoles.length;
|
|
58
|
+
const bIdx = bRole >= 0 ? bRole : preferredRoles.length;
|
|
59
|
+
return aIdx - bIdx;
|
|
60
|
+
});
|
|
61
|
+
// Click top candidates
|
|
62
|
+
const remaining = maxClicks - clicked.length;
|
|
63
|
+
for (const cand of candidates.slice(0, remaining)) {
|
|
64
|
+
// Validate ref is numeric-only to prevent CSS selector injection
|
|
65
|
+
if (!/^\d+$/.test(cand.ref))
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
await page.evaluate(`(() => {
|
|
69
|
+
const el = document.querySelector('[data-unicli-ref="${cand.ref}"]');
|
|
70
|
+
if (el) el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
|
|
71
|
+
})()`);
|
|
72
|
+
clicked.push(cand.text.slice(0, 30));
|
|
73
|
+
await page.wait(delayMs / 1000);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
/* click failed */
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* snapshot failed — return what we have */
|
|
82
|
+
}
|
|
83
|
+
return { clicked: clicked.length, labels: clicked };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/engine/probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoResearch Engine — Karpathy-style self-improvement loop.
|
|
3
|
+
*
|
|
4
|
+
* 8-phase loop: precondition → review → modify (Claude Code) →
|
|
5
|
+
* commit → verify (eval) → guard → decide (keep/discard) → log.
|
|
6
|
+
*
|
|
7
|
+
* Adapted from Open-CLI's autoresearch concept, scoped to YAML
|
|
8
|
+
* adapter modification and integrated with Uni-CLI's eval harness.
|
|
9
|
+
*/
|
|
10
|
+
export interface ResearchConfig {
|
|
11
|
+
site: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
goal: string;
|
|
14
|
+
verify: string;
|
|
15
|
+
guard?: string;
|
|
16
|
+
scope: string[];
|
|
17
|
+
metric: string;
|
|
18
|
+
direction: "higher" | "lower";
|
|
19
|
+
maxIterations: number;
|
|
20
|
+
minDelta: number;
|
|
21
|
+
}
|
|
22
|
+
export interface IterationResult {
|
|
23
|
+
iteration: number;
|
|
24
|
+
status: "baseline" | "keep" | "discard" | "crash" | "no-op" | "hook-blocked";
|
|
25
|
+
metric: number;
|
|
26
|
+
description: string;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ResearchCallbacks {
|
|
30
|
+
onStatus?: (msg: string) => void;
|
|
31
|
+
onIteration?: (result: IterationResult) => void;
|
|
32
|
+
}
|
|
33
|
+
export declare function runResearchLoop(config: ResearchConfig, callbacks?: ResearchCallbacks): Promise<IterationResult[]>;
|
|
34
|
+
export declare function readResearchLog(opts?: {
|
|
35
|
+
site?: string;
|
|
36
|
+
since?: number;
|
|
37
|
+
}): IterationResult[];
|
|
38
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/engine/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CACjD;AAkQD,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,eAAe,EAAE,CAAC,CAyL5B;AAID,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,eAAe,EAAE,CA0BpB"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoResearch Engine — Karpathy-style self-improvement loop.
|
|
3
|
+
*
|
|
4
|
+
* 8-phase loop: precondition → review → modify (Claude Code) →
|
|
5
|
+
* commit → verify (eval) → guard → decide (keep/discard) → log.
|
|
6
|
+
*
|
|
7
|
+
* Adapted from Open-CLI's autoresearch concept, scoped to YAML
|
|
8
|
+
* adapter modification and integrated with Uni-CLI's eval harness.
|
|
9
|
+
*/
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
|
+
import { existsSync, readFileSync, readdirSync, appendFileSync, mkdirSync, } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
/** Strict site name pattern — prevents shell injection in interpolated commands. */
|
|
15
|
+
const SAFE_SITE_NAME = /^[a-zA-Z0-9_-]+$/;
|
|
16
|
+
// ── Stuck Hints ──────────────────────────────────────────────────────────
|
|
17
|
+
const STUCK_HINTS = [
|
|
18
|
+
"Try a completely different approach — the current direction is not working.",
|
|
19
|
+
"Try the OPPOSITE of what has been failing.",
|
|
20
|
+
"Consider changing the pipeline pattern entirely (e.g. fetch→intercept).",
|
|
21
|
+
"Consider if the endpoint URL itself needs to change.",
|
|
22
|
+
"The adapter may need a fundamentally different strategy.",
|
|
23
|
+
];
|
|
24
|
+
// ── Engine ───────────────────────────────────────────────────────────────
|
|
25
|
+
const EXEC_OPTS = { encoding: "utf-8", timeout: 60_000 };
|
|
26
|
+
const LOG_DIR = join(homedir(), ".unicli");
|
|
27
|
+
const LOG_FILE = join(LOG_DIR, "research.tsv");
|
|
28
|
+
function extractMetric(output, metricRegex) {
|
|
29
|
+
const re = new RegExp(metricRegex);
|
|
30
|
+
// Reset lastIndex for safety with global/sticky regexes
|
|
31
|
+
re.lastIndex = 0;
|
|
32
|
+
const match = re.exec(output);
|
|
33
|
+
if (!match)
|
|
34
|
+
return 0;
|
|
35
|
+
// If capturing groups exist, use first group; otherwise use full match
|
|
36
|
+
const raw = match[1] ?? match[0];
|
|
37
|
+
const val = parseFloat(raw);
|
|
38
|
+
return Number.isFinite(val) ? val : 0;
|
|
39
|
+
}
|
|
40
|
+
function gitExec(args) {
|
|
41
|
+
return execFileSync("git", args, EXEC_OPTS);
|
|
42
|
+
}
|
|
43
|
+
function appendLog(result, site) {
|
|
44
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
45
|
+
const line = [
|
|
46
|
+
new Date().toISOString(),
|
|
47
|
+
site,
|
|
48
|
+
result.iteration,
|
|
49
|
+
result.status,
|
|
50
|
+
result.metric,
|
|
51
|
+
result.description.slice(0, 120),
|
|
52
|
+
result.durationMs,
|
|
53
|
+
].join("\t");
|
|
54
|
+
appendFileSync(LOG_FILE, line + "\n");
|
|
55
|
+
}
|
|
56
|
+
// ── Safe glob resolution (no shell) ─────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Resolve scope patterns to actual files without shell execution.
|
|
59
|
+
* Supports simple patterns like `src/adapters/site/*.yaml`.
|
|
60
|
+
*/
|
|
61
|
+
function resolveScope(patterns) {
|
|
62
|
+
const files = [];
|
|
63
|
+
for (const pattern of patterns) {
|
|
64
|
+
// Split at last directory separator before the glob
|
|
65
|
+
const starIdx = pattern.indexOf("*");
|
|
66
|
+
if (starIdx === -1) {
|
|
67
|
+
// No glob — treat as literal file
|
|
68
|
+
if (existsSync(pattern))
|
|
69
|
+
files.push(pattern);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const dir = pattern.slice(0, pattern.lastIndexOf("/", starIdx));
|
|
73
|
+
const extFilter = pattern.slice(pattern.lastIndexOf("."));
|
|
74
|
+
if (!existsSync(dir))
|
|
75
|
+
continue;
|
|
76
|
+
try {
|
|
77
|
+
for (const entry of readdirSync(dir)) {
|
|
78
|
+
if (extFilter && !entry.endsWith(extFilter))
|
|
79
|
+
continue;
|
|
80
|
+
const fullPath = join(dir, entry);
|
|
81
|
+
files.push(fullPath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* directory read failed */
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return files;
|
|
89
|
+
}
|
|
90
|
+
// ── Phase 0: Preconditions ──────────────────────────────────────────────
|
|
91
|
+
function checkPreconditions() {
|
|
92
|
+
// Must be in a git repo
|
|
93
|
+
try {
|
|
94
|
+
gitExec(["rev-parse", "--is-inside-work-tree"]);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error("Not inside a git repository");
|
|
98
|
+
}
|
|
99
|
+
// No index.lock
|
|
100
|
+
if (existsSync(".git/index.lock")) {
|
|
101
|
+
throw new Error(".git/index.lock exists — another git process may be running");
|
|
102
|
+
}
|
|
103
|
+
// Not detached HEAD
|
|
104
|
+
try {
|
|
105
|
+
gitExec(["symbolic-ref", "--short", "HEAD"]);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new Error("Detached HEAD — checkout a branch first");
|
|
109
|
+
}
|
|
110
|
+
// Clean working tree for scope files
|
|
111
|
+
const status = gitExec(["status", "--porcelain"]).trim();
|
|
112
|
+
if (status.length > 0) {
|
|
113
|
+
throw new Error("Working tree has uncommitted changes. Commit or stash first.");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ── Phase 4: Verify ─────────────────────────────────────────────────────
|
|
117
|
+
function runVerify(config) {
|
|
118
|
+
// Validate site name to prevent injection when used in command construction
|
|
119
|
+
if (!SAFE_SITE_NAME.test(config.site)) {
|
|
120
|
+
return { output: "invalid site name", metric: 0 };
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
// Use execFileSync with explicit args — no shell interpretation
|
|
124
|
+
const output = execFileSync("unicli", ["eval", "run", config.site, "--json"], { encoding: "utf-8", timeout: 120_000, stdio: ["pipe", "pipe", "pipe"] });
|
|
125
|
+
return { output, metric: extractMetric(output, config.metric) };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const output = err instanceof Error && "stdout" in err
|
|
129
|
+
? String(err.stdout)
|
|
130
|
+
: "";
|
|
131
|
+
return {
|
|
132
|
+
output,
|
|
133
|
+
metric: config.direction === "lower"
|
|
134
|
+
? Infinity
|
|
135
|
+
: extractMetric(output, config.metric),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// ── Phase 5.5: Guard ────────────────────────────────────────────────────
|
|
140
|
+
function runGuard(config) {
|
|
141
|
+
if (!config.guard)
|
|
142
|
+
return "skip";
|
|
143
|
+
// Guard runs `unicli eval run --all` or similar — use execFile with args
|
|
144
|
+
try {
|
|
145
|
+
execFileSync("unicli", ["eval", "run", "--all"], {
|
|
146
|
+
encoding: "utf-8",
|
|
147
|
+
timeout: 120_000,
|
|
148
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
149
|
+
});
|
|
150
|
+
return "pass";
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return "fail";
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ── Phase 6: Keep/Discard ───────────────────────────────────────────────
|
|
157
|
+
function safeRevert() {
|
|
158
|
+
try {
|
|
159
|
+
gitExec(["revert", "HEAD", "--no-edit"]);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
try {
|
|
163
|
+
gitExec(["revert", "--abort"]);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
/* ignore */
|
|
167
|
+
}
|
|
168
|
+
gitExec(["reset", "--hard", "HEAD~1"]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ── Phase 2: Modify (Claude Code invocation) ────────────────────────────
|
|
172
|
+
function buildModifyPrompt(config, iteration, bestMetric, currentMetric, consecutiveDiscards, recentLog, scopeContents) {
|
|
173
|
+
const stuckHint = consecutiveDiscards >= 5
|
|
174
|
+
? STUCK_HINTS[Math.min(consecutiveDiscards - 5, STUCK_HINTS.length - 1)]
|
|
175
|
+
: null;
|
|
176
|
+
const logSummary = recentLog
|
|
177
|
+
.slice(-10)
|
|
178
|
+
.map((r) => ` ${String(r.status).padEnd(12)} metric=${r.metric} ${r.description}`)
|
|
179
|
+
.join("\n");
|
|
180
|
+
return `You are improving a Uni-CLI YAML adapter for "${config.site}".
|
|
181
|
+
|
|
182
|
+
## Goal
|
|
183
|
+
${config.goal}
|
|
184
|
+
|
|
185
|
+
## Current State
|
|
186
|
+
- Iteration: ${iteration}
|
|
187
|
+
- Current metric: ${currentMetric}
|
|
188
|
+
- Best metric: ${bestMetric}
|
|
189
|
+
- Consecutive discards: ${consecutiveDiscards}
|
|
190
|
+
${stuckHint ? `\n## STUCK HINT\n${stuckHint}\n` : ""}
|
|
191
|
+
## Recent History
|
|
192
|
+
${logSummary || "(none)"}
|
|
193
|
+
|
|
194
|
+
## Scope Files
|
|
195
|
+
${scopeContents}
|
|
196
|
+
|
|
197
|
+
## Rules
|
|
198
|
+
1. Make exactly ONE focused change per iteration
|
|
199
|
+
2. Only modify files matching the scope patterns: ${config.scope.join(", ")}
|
|
200
|
+
3. The verify command is: ${config.verify}
|
|
201
|
+
4. Metric direction: ${config.direction} is better
|
|
202
|
+
5. Do NOT add comments explaining your changes
|
|
203
|
+
6. Do NOT modify test files or configuration`;
|
|
204
|
+
}
|
|
205
|
+
function invokeClaudeCode(prompt) {
|
|
206
|
+
try {
|
|
207
|
+
// Use execFileSync (no shell) to avoid injection — safer than Open-CLI's
|
|
208
|
+
// execSync approach which requires manual quote escaping.
|
|
209
|
+
const result = execFileSync("claude", [
|
|
210
|
+
"-p",
|
|
211
|
+
"--dangerously-skip-permissions",
|
|
212
|
+
"--allowedTools",
|
|
213
|
+
"Read,Edit,Glob,Grep",
|
|
214
|
+
"--output-format",
|
|
215
|
+
"text",
|
|
216
|
+
"--no-session-persistence",
|
|
217
|
+
prompt,
|
|
218
|
+
], { encoding: "utf-8", timeout: 300_000, stdio: ["pipe", "pipe", "pipe"] });
|
|
219
|
+
// Extract description from last non-empty line
|
|
220
|
+
const lines = result.trim().split("\n").filter(Boolean);
|
|
221
|
+
const desc = lines.length > 0 ? lines[lines.length - 1].trim() : null;
|
|
222
|
+
return desc ? desc.slice(0, 120) : "change made by research loop";
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ── Main Loop ────────────────────────────────────────────────────────────
|
|
229
|
+
export async function runResearchLoop(config, callbacks) {
|
|
230
|
+
const results = [];
|
|
231
|
+
let bestMetric;
|
|
232
|
+
let consecutiveDiscards = 0;
|
|
233
|
+
// Phase 0: Preconditions
|
|
234
|
+
checkPreconditions();
|
|
235
|
+
// Baseline measurement
|
|
236
|
+
callbacks?.onStatus?.("Running baseline verification...");
|
|
237
|
+
const baseline = runVerify(config);
|
|
238
|
+
bestMetric = baseline.metric;
|
|
239
|
+
const baselineResult = {
|
|
240
|
+
iteration: 0,
|
|
241
|
+
status: "baseline",
|
|
242
|
+
metric: baseline.metric,
|
|
243
|
+
description: "Baseline measurement",
|
|
244
|
+
durationMs: 0,
|
|
245
|
+
};
|
|
246
|
+
results.push(baselineResult);
|
|
247
|
+
appendLog(baselineResult, config.site);
|
|
248
|
+
callbacks?.onIteration?.(baselineResult);
|
|
249
|
+
callbacks?.onStatus?.(`Baseline: metric=${baseline.metric}`);
|
|
250
|
+
// Main loop
|
|
251
|
+
for (let i = 1; i <= config.maxIterations; i++) {
|
|
252
|
+
const startMs = Date.now();
|
|
253
|
+
// Stuck detection: abort if too many consecutive discards
|
|
254
|
+
if (consecutiveDiscards >= 13) {
|
|
255
|
+
callbacks?.onStatus?.(`Stuck after ${consecutiveDiscards} consecutive discards. Stopping.`);
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
callbacks?.onStatus?.(`Iteration ${i}/${config.maxIterations} (best=${bestMetric}, discards=${consecutiveDiscards})`);
|
|
259
|
+
// Phase 1: Review — read scope files (safe glob, no shell)
|
|
260
|
+
let scopeContents = "";
|
|
261
|
+
const scopeFiles = resolveScope(config.scope);
|
|
262
|
+
for (const f of scopeFiles) {
|
|
263
|
+
scopeContents += `\n--- ${f} ---\n${readFileSync(f, "utf-8")}\n`;
|
|
264
|
+
}
|
|
265
|
+
// Phase 2+3: Modify
|
|
266
|
+
const prompt = buildModifyPrompt(config, i, bestMetric, bestMetric, // pass current best, not stale baseline
|
|
267
|
+
consecutiveDiscards, results, scopeContents);
|
|
268
|
+
const description = invokeClaudeCode(prompt);
|
|
269
|
+
if (!description) {
|
|
270
|
+
const result = {
|
|
271
|
+
iteration: i,
|
|
272
|
+
status: "crash",
|
|
273
|
+
metric: bestMetric,
|
|
274
|
+
description: "Claude Code invocation failed",
|
|
275
|
+
durationMs: Date.now() - startMs,
|
|
276
|
+
};
|
|
277
|
+
results.push(result);
|
|
278
|
+
appendLog(result, config.site);
|
|
279
|
+
callbacks?.onIteration?.(result);
|
|
280
|
+
consecutiveDiscards++;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// Phase 4: Commit
|
|
284
|
+
try {
|
|
285
|
+
// Stage only scope files (safe — no shell, explicit file list)
|
|
286
|
+
const filesToStage = resolveScope(config.scope);
|
|
287
|
+
if (filesToStage.length > 0) {
|
|
288
|
+
gitExec(["add", "--", ...filesToStage]);
|
|
289
|
+
}
|
|
290
|
+
const diff = gitExec(["diff", "--cached", "--stat"]).trim();
|
|
291
|
+
if (!diff) {
|
|
292
|
+
const result = {
|
|
293
|
+
iteration: i,
|
|
294
|
+
status: "no-op",
|
|
295
|
+
metric: bestMetric,
|
|
296
|
+
description: "No changes made",
|
|
297
|
+
durationMs: Date.now() - startMs,
|
|
298
|
+
};
|
|
299
|
+
results.push(result);
|
|
300
|
+
appendLog(result, config.site);
|
|
301
|
+
callbacks?.onIteration?.(result);
|
|
302
|
+
consecutiveDiscards++;
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
gitExec(["commit", "-m", `research(${config.site}): ${description}`]);
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// Hook failure
|
|
310
|
+
gitExec(["reset", "HEAD"]);
|
|
311
|
+
const result = {
|
|
312
|
+
iteration: i,
|
|
313
|
+
status: "hook-blocked",
|
|
314
|
+
metric: bestMetric,
|
|
315
|
+
description: "Pre-commit hook blocked",
|
|
316
|
+
durationMs: Date.now() - startMs,
|
|
317
|
+
};
|
|
318
|
+
results.push(result);
|
|
319
|
+
appendLog(result, config.site);
|
|
320
|
+
callbacks?.onIteration?.(result);
|
|
321
|
+
consecutiveDiscards++;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
const result = {
|
|
327
|
+
iteration: i,
|
|
328
|
+
status: "crash",
|
|
329
|
+
metric: bestMetric,
|
|
330
|
+
description: "Git commit failed",
|
|
331
|
+
durationMs: Date.now() - startMs,
|
|
332
|
+
};
|
|
333
|
+
results.push(result);
|
|
334
|
+
appendLog(result, config.site);
|
|
335
|
+
callbacks?.onIteration?.(result);
|
|
336
|
+
consecutiveDiscards++;
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
// Phase 5: Verify
|
|
340
|
+
const verification = runVerify(config);
|
|
341
|
+
// Phase 5.5: Guard
|
|
342
|
+
const guardResult = runGuard(config);
|
|
343
|
+
// Phase 6: Decide
|
|
344
|
+
const improved = config.direction === "higher"
|
|
345
|
+
? verification.metric > bestMetric
|
|
346
|
+
: verification.metric < bestMetric;
|
|
347
|
+
const delta = Math.abs(verification.metric - bestMetric);
|
|
348
|
+
if (improved && delta >= config.minDelta && guardResult !== "fail") {
|
|
349
|
+
// Keep
|
|
350
|
+
bestMetric = verification.metric;
|
|
351
|
+
consecutiveDiscards = 0;
|
|
352
|
+
const result = {
|
|
353
|
+
iteration: i,
|
|
354
|
+
status: "keep",
|
|
355
|
+
metric: verification.metric,
|
|
356
|
+
description,
|
|
357
|
+
durationMs: Date.now() - startMs,
|
|
358
|
+
};
|
|
359
|
+
results.push(result);
|
|
360
|
+
appendLog(result, config.site);
|
|
361
|
+
callbacks?.onIteration?.(result);
|
|
362
|
+
callbacks?.onStatus?.(`KEEP: metric ${bestMetric} (${description})`);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
// Discard
|
|
366
|
+
safeRevert();
|
|
367
|
+
consecutiveDiscards++;
|
|
368
|
+
const reason = guardResult === "fail"
|
|
369
|
+
? "guard blocked"
|
|
370
|
+
: !improved
|
|
371
|
+
? "no improvement"
|
|
372
|
+
: "below min delta";
|
|
373
|
+
const result = {
|
|
374
|
+
iteration: i,
|
|
375
|
+
status: "discard",
|
|
376
|
+
metric: verification.metric,
|
|
377
|
+
description: `${reason}: ${description}`,
|
|
378
|
+
durationMs: Date.now() - startMs,
|
|
379
|
+
};
|
|
380
|
+
results.push(result);
|
|
381
|
+
appendLog(result, config.site);
|
|
382
|
+
callbacks?.onIteration?.(result);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return results;
|
|
386
|
+
}
|
|
387
|
+
// ── Log Reading ──────────────────────────────────────────────────────────
|
|
388
|
+
export function readResearchLog(opts) {
|
|
389
|
+
if (!existsSync(LOG_FILE))
|
|
390
|
+
return [];
|
|
391
|
+
const lines = readFileSync(LOG_FILE, "utf-8").trim().split("\n");
|
|
392
|
+
const results = [];
|
|
393
|
+
for (const line of lines) {
|
|
394
|
+
if (!line.trim())
|
|
395
|
+
continue;
|
|
396
|
+
const parts = line.split("\t");
|
|
397
|
+
if (parts.length < 7)
|
|
398
|
+
continue;
|
|
399
|
+
const [ts, site, iteration, status, metric, description, durationMs] = parts;
|
|
400
|
+
if (opts?.site && site !== opts.site)
|
|
401
|
+
continue;
|
|
402
|
+
if (opts?.since && new Date(ts).getTime() < opts.since)
|
|
403
|
+
continue;
|
|
404
|
+
results.push({
|
|
405
|
+
iteration: parseInt(iteration, 10),
|
|
406
|
+
status: status,
|
|
407
|
+
metric: parseFloat(metric),
|
|
408
|
+
description,
|
|
409
|
+
durationMs: parseInt(durationMs, 10),
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
return results;
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/engine/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,oFAAoF;AACpF,MAAM,cAAc,GAAG,kBAAkB,CAAC;AA8B1C,4EAA4E;AAE5E,MAAM,WAAW,GAAG;IAClB,6EAA6E;IAC7E,4CAA4C;IAC5C,yEAAyE;IACzE,sDAAsD;IACtD,0DAA0D;CAC3D,CAAC;AAEF,4EAA4E;AAE5E,MAAM,SAAS,GAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAE/C,SAAS,aAAa,CAAC,MAAc,EAAE,WAAmB;IACxD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,wDAAwD;IACxD,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,uEAAuE;IACvE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAW,CAAC;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,MAAuB,EAAE,IAAY;IACtD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG;QACX,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxB,IAAI;QACJ,MAAM,CAAC,SAAS;QAChB,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAChC,MAAM,CAAC,UAAU;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,cAAc,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,2EAA2E;AAE3E;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAkB;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,oDAAoD;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,kCAAkC;YAClC,IAAI,UAAU,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAAE,SAAS;gBACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAE3E,SAAS,kBAAkB;IACzB,wBAAwB;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;IAChB,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,SAAS,CAAC,MAAsB;IAIvC,4EAA4E;IAC5E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,gEAAgE;QAChE,MAAM,MAAM,GAAG,YAAY,CACzB,QAAQ,EACR,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EACtC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC/D,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,YAAY,KAAK,IAAI,QAAQ,IAAI,GAAG;YACrC,CAAC,CAAC,MAAM,CAAE,GAA2B,CAAC,MAAM,CAAC;YAC7C,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACL,MAAM;YACN,MAAM,EACJ,MAAM,CAAC,SAAS,KAAK,OAAO;gBAC1B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;SAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,QAAQ,CAAC,MAAsB;IACtC,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IACjC,yEAAyE;IACzE,IAAI,CAAC;QACH,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,iBAAiB,CACxB,MAAsB,EACtB,SAAiB,EACjB,UAAkB,EAClB,aAAqB,EACrB,mBAA2B,EAC3B,SAA4B,EAC5B,aAAqB;IAErB,MAAM,SAAS,GACb,mBAAmB,IAAI,CAAC;QACtB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,UAAU,GAAG,SAAS;SACzB,KAAK,CAAC,CAAC,EAAE,CAAC;SACV,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,CACzE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,iDAAiD,MAAM,CAAC,IAAI;;;EAGnE,MAAM,CAAC,IAAI;;;eAGE,SAAS;oBACJ,aAAa;iBAChB,UAAU;0BACD,mBAAmB;EAC3C,SAAS,CAAC,CAAC,CAAC,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE;;EAElD,UAAU,IAAI,QAAQ;;;EAGtB,aAAa;;;;oDAIqC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;4BAC/C,MAAM,CAAC,MAAM;uBAClB,MAAM,CAAC,SAAS;;6CAEM,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,CAAC;QACH,yEAAyE;QACzE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,YAAY,CACzB,QAAQ,EACR;YACE,IAAI;YACJ,gCAAgC;YAChC,gBAAgB;YAChB,qBAAqB;YACrB,iBAAiB;YACjB,MAAM;YACN,0BAA0B;YAC1B,MAAM;SACP,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC/D,CAAC;QAEZ,+CAA+C;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,SAA6B;IAE7B,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,IAAI,UAAkB,CAAC;IACvB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,yBAAyB;IACzB,kBAAkB,EAAE,CAAC;IAErB,uBAAuB;IACvB,SAAS,EAAE,QAAQ,EAAE,CAAC,kCAAkC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE7B,MAAM,cAAc,GAAoB;QACtC,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,CAAC;KACd,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,SAAS,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC;IACzC,SAAS,EAAE,QAAQ,EAAE,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7D,YAAY;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE3B,0DAA0D;QAC1D,IAAI,mBAAmB,IAAI,EAAE,EAAE,CAAC;YAC9B,SAAS,EAAE,QAAQ,EAAE,CACnB,eAAe,mBAAmB,kCAAkC,CACrE,CAAC;YACF,MAAM;QACR,CAAC;QAED,SAAS,EAAE,QAAQ,EAAE,CACnB,aAAa,CAAC,IAAI,MAAM,CAAC,aAAa,UAAU,UAAU,cAAc,mBAAmB,GAAG,CAC/F,CAAC;QAEF,2DAA2D;QAC3D,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,aAAa,IAAI,SAAS,CAAC,SAAS,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC;QACnE,CAAC;QAED,oBAAoB;QACpB,MAAM,MAAM,GAAG,iBAAiB,CAC9B,MAAM,EACN,CAAC,EACD,UAAU,EACV,UAAU,EAAE,wCAAwC;QACpD,mBAAmB,EACnB,OAAO,EACP,aAAa,CACd,CAAC;QACF,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,GAAoB;gBAC9B,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,+BAA+B;gBAC5C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aACjC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,+DAA+D;YAC/D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,MAAM,GAAoB;oBAC9B,SAAS,EAAE,CAAC;oBACZ,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,UAAU;oBAClB,WAAW,EAAE,iBAAiB;oBAC9B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;iBACjC,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;gBACjC,mBAAmB,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,MAAM,CAAC,IAAI,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;YACxE,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;gBACf,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAoB;oBAC9B,SAAS,EAAE,CAAC;oBACZ,MAAM,EAAE,cAAc;oBACtB,MAAM,EAAE,UAAU;oBAClB,WAAW,EAAE,yBAAyB;oBACtC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;iBACjC,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;gBACjC,mBAAmB,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAoB;gBAC9B,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,mBAAmB;gBAChC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aACjC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;YACjC,mBAAmB,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,kBAAkB;QAClB,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEvC,mBAAmB;QACnB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAErC,kBAAkB;QAClB,MAAM,QAAQ,GACZ,MAAM,CAAC,SAAS,KAAK,QAAQ;YAC3B,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU;YAClC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC;QAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QAEzD,IAAI,QAAQ,IAAI,KAAK,IAAI,MAAM,CAAC,QAAQ,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YACnE,OAAO;YACP,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;YACjC,mBAAmB,GAAG,CAAC,CAAC;YACxB,MAAM,MAAM,GAAoB;gBAC9B,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,WAAW;gBACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aACjC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;YACjC,SAAS,EAAE,QAAQ,EAAE,CAAC,gBAAgB,UAAU,KAAK,WAAW,GAAG,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,UAAU;YACV,UAAU,EAAE,CAAC;YACb,mBAAmB,EAAE,CAAC;YACtB,MAAM,MAAM,GACV,WAAW,KAAK,MAAM;gBACpB,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,CAAC,QAAQ;oBACT,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,iBAAiB,CAAC;YAC1B,MAAM,MAAM,GAAoB;gBAC9B,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,WAAW,EAAE,GAAG,MAAM,KAAK,WAAW,EAAE;gBACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aACjC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,SAAS,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAE5E,MAAM,UAAU,eAAe,CAAC,IAG/B;IACC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,GAClE,KAAK,CAAC;QAER,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,SAAS;QAC/C,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK;YAAE,SAAS;QAEjE,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;YAClC,MAAM,EAAE,MAAmC;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;YAC1B,WAAW;YACX,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -78,7 +78,7 @@ function registerExitMessage(latest) {
|
|
|
78
78
|
_registered = true;
|
|
79
79
|
process.on("exit", (code) => {
|
|
80
80
|
if (code === 0) {
|
|
81
|
-
process.stderr.write(`\n${chalk.yellow(`Update available: ${VERSION} → ${latest}`)} — run ${chalk.cyan("npm i -g unicli")} to upgrade\n`);
|
|
81
|
+
process.stderr.write(`\n${chalk.yellow(`Update available: ${VERSION} → ${latest}`)} — run ${chalk.cyan("npm i -g @zenalexa/unicli")} to upgrade\n`);
|
|
82
82
|
}
|
|
83
83
|
});
|
|
84
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/engine/update-check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/engine/update-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;AACnE,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AACrD,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAOhE;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,aAAa;IACb,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO;IAE3B,iCAAiC;IACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAElC,oBAAoB;IACpB,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;YACjD,4CAA4C;YAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBACjE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;SACvD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC3B,IAAI,CAAC,CAAC,IAAa,EAAE,EAAE;QACtB,MAAM,MAAM,GAAI,IAA4B,CAAC,OAAO,CAAC;QACrD,cAAc;QACd,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACjD,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACnD,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,uCAAuC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,OAAe;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,SAAS,mBAAmB,CAAC,MAAc;IACzC,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,KAAK,CAAC,MAAM,CAAC,qBAAqB,OAAO,MAAM,MAAM,EAAE,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAC9H,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-runner.d.ts","sourceRoot":"","sources":["../../src/engine/yaml-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"yaml-runner.d.ts","sourceRoot":"","sources":["../../src/engine/yaml-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkBH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmBtD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EACL,YAAY,GACZ,eAAe,GACf,cAAc,GACd,aAAa,GACb,SAAS,GACT,kBAAkB,GAClB,kBAAkB,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB;gBAjBD,OAAO,EAAE,MAAM,EACC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EACL,YAAY,GACZ,eAAe,GACf,cAAc,GACd,aAAa,GACb,SAAS,GACT,kBAAkB,GAClB,kBAAkB,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB;IAMH,4EAA4E;IAC5E,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM;cAtBtB,MAAM;gBACJ,MAAM;gBACN,OAAO;mBAEX,YAAY,GACZ,eAAe,GACf,cAAc,GACd,aAAa,GACb,SAAS,GACT,kBAAkB,GAClB,kBAAkB;cAChB,MAAM;qBACC,MAAM;0BACD,MAAM;oBACZ,MAAM;;;;CAevB;AAmID,wBAAsB,WAAW,CAC/B,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,EAAE,CAAC,CAqPpB;AA+wBD,iBAAS,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBjE;AAwOD;;;;;GAKG;AACH,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAyFjE,CAAC;AA0GF;;;;;;;GAOG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CA6D7E;AAqwBD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC"}
|