ralph-flow-pi 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.
- package/LICENSE +21 -0
- package/README.md +428 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/prompts.d.ts +25 -0
- package/dist/commands/prompts.d.ts.map +1 -0
- package/dist/commands/prompts.js +249 -0
- package/dist/commands/prompts.js.map +1 -0
- package/dist/commands/tools.d.ts +47 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +633 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/engine/check-bash.d.ts +121 -0
- package/dist/engine/check-bash.d.ts.map +1 -0
- package/dist/engine/check-bash.js +373 -0
- package/dist/engine/check-bash.js.map +1 -0
- package/dist/engine/check.d.ts +47 -0
- package/dist/engine/check.d.ts.map +1 -0
- package/dist/engine/check.js +298 -0
- package/dist/engine/check.js.map +1 -0
- package/dist/engine/core.d.ts +153 -0
- package/dist/engine/core.d.ts.map +1 -0
- package/dist/engine/core.js +1984 -0
- package/dist/engine/core.js.map +1 -0
- package/dist/engine/lock.d.ts +27 -0
- package/dist/engine/lock.d.ts.map +1 -0
- package/dist/engine/lock.js +121 -0
- package/dist/engine/lock.js.map +1 -0
- package/dist/engine/runner.d.ts +108 -0
- package/dist/engine/runner.d.ts.map +1 -0
- package/dist/engine/runner.js +510 -0
- package/dist/engine/runner.js.map +1 -0
- package/dist/engine/skills.d.ts +53 -0
- package/dist/engine/skills.d.ts.map +1 -0
- package/dist/engine/skills.js +109 -0
- package/dist/engine/skills.js.map +1 -0
- package/dist/engine/step-tools.d.ts +22 -0
- package/dist/engine/step-tools.d.ts.map +1 -0
- package/dist/engine/step-tools.js +45 -0
- package/dist/engine/step-tools.js.map +1 -0
- package/dist/engine/types.d.ts +136 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +20 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/headless.d.ts +57 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +318 -0
- package/dist/headless.js.map +1 -0
- package/dist/pi/adapter.d.ts +135 -0
- package/dist/pi/adapter.d.ts.map +1 -0
- package/dist/pi/adapter.js +231 -0
- package/dist/pi/adapter.js.map +1 -0
- package/dist/pi/interactive.d.ts +28 -0
- package/dist/pi/interactive.d.ts.map +1 -0
- package/dist/pi/interactive.js +58 -0
- package/dist/pi/interactive.js.map +1 -0
- package/dist/pi/tui.d.ts +12 -0
- package/dist/pi/tui.d.ts.map +1 -0
- package/dist/pi/tui.js +12 -0
- package/dist/pi/tui.js.map +1 -0
- package/dist/tui/app.d.ts +25 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +47 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/embed.d.ts +42 -0
- package/dist/tui/embed.d.ts.map +1 -0
- package/dist/tui/embed.js +38 -0
- package/dist/tui/embed.js.map +1 -0
- package/dist/tui/extension.d.ts +88 -0
- package/dist/tui/extension.d.ts.map +1 -0
- package/dist/tui/extension.js +114 -0
- package/dist/tui/extension.js.map +1 -0
- package/dist/tui/history-editor.d.ts +38 -0
- package/dist/tui/history-editor.d.ts.map +1 -0
- package/dist/tui/history-editor.js +55 -0
- package/dist/tui/history-editor.js.map +1 -0
- package/dist/tui/launcher.d.ts +24 -0
- package/dist/tui/launcher.d.ts.map +1 -0
- package/dist/tui/launcher.js +97 -0
- package/dist/tui/launcher.js.map +1 -0
- package/dist/tui/render.d.ts +87 -0
- package/dist/tui/render.d.ts.map +1 -0
- package/dist/tui/render.js +266 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/run-app.d.ts +49 -0
- package/dist/tui/run-app.d.ts.map +1 -0
- package/dist/tui/run-app.js +317 -0
- package/dist/tui/run-app.js.map +1 -0
- package/dist/tui/run-model.d.ts +162 -0
- package/dist/tui/run-model.d.ts.map +1 -0
- package/dist/tui/run-model.js +280 -0
- package/dist/tui/run-model.js.map +1 -0
- package/dist/tui/run-view.d.ts +71 -0
- package/dist/tui/run-view.d.ts.map +1 -0
- package/dist/tui/run-view.js +167 -0
- package/dist/tui/run-view.js.map +1 -0
- package/dist/tui/welcome-header.d.ts +40 -0
- package/dist/tui/welcome-header.d.ts.map +1 -0
- package/dist/tui/welcome-header.js +90 -0
- package/dist/tui/welcome-header.js.map +1 -0
- package/package.json +55 -0
- package/skills/c-to-rust-audit/SKILL.md +67 -0
- package/skills/c-to-rust-implement/SKILL.md +151 -0
- package/skills/c-to-rust-implement/references/c-to-rust-patterns.md +86 -0
- package/skills/c-to-rust-implement/references/conditional-compilation.md +47 -0
- package/skills/c-to-rust-implement/references/crate-reference.md +15 -0
- package/skills/c-to-rust-implement/references/error-strategies.md +80 -0
- package/skills/c-to-rust-implement/references/inline-asm.md +37 -0
- package/skills/c-to-rust-plan/SKILL.md +166 -0
- package/skills/c-to-rust-plan/references/detection-commands.md +66 -0
- package/skills/c-to-rust-test-gen/SKILL.md +130 -0
- package/skills/c-to-rust-test-gen/references/proptest-patterns.md +81 -0
- package/skills/c-to-rust-test-gen/references/test-porting.md +56 -0
- package/skills/c-to-rust-validate/SKILL.md +121 -0
- package/skills/everything2rust-audit/SKILL.md +69 -0
- package/skills/everything2rust-design/SKILL.md +121 -0
- package/skills/everything2rust-design/references/domain-playbooks.md +68 -0
- package/skills/everything2rust-design/references/paradigm-map.md +99 -0
- package/skills/everything2rust-implement/SKILL.md +101 -0
- package/skills/everything2rust-spec/SKILL.md +86 -0
- package/skills/everything2rust-spec/references/oracle-strategies.md +96 -0
- package/skills/everything2rust-survey/SKILL.md +99 -0
- package/skills/everything2rust-test-gen/SKILL.md +68 -0
- package/skills/everything2rust-test-gen/references/harness-patterns.md +186 -0
- package/skills/everything2rust-validate/SKILL.md +85 -0
- package/workflows/c-to-rust.yaml +202 -0
- package/workflows/everything2rust.yaml +259 -0
- package/workflows/loop.yaml +68 -0
- package/workflows/spec.yaml +183 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The verifier's only shell access: a whitelist-checked bash tool.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists at all: both plugin versions delegated the read-only
|
|
5
|
+
* guarantee to their host (opencode's agent permission map, Claude's
|
|
6
|
+
* `--allowedTools`). ralph-flow-pi has no host to delegate to, so it enforces
|
|
7
|
+
* the same allow-list itself, right before spawning.
|
|
8
|
+
*
|
|
9
|
+
* The allow-list (RALPH_CHECK_BASH_PERMISSION in core.ts) is a verbatim port.
|
|
10
|
+
* The ENFORCEMENT is deliberately stricter than either plugin, because here we
|
|
11
|
+
* own the executor and a glob match against the whole command string is not a
|
|
12
|
+
* safe primitive:
|
|
13
|
+
*
|
|
14
|
+
* "cat x && rm -rf y" → the plugins glob-match "cat *" and allow the whole
|
|
15
|
+
* string, rm included. We split on &&/||/;/| and check
|
|
16
|
+
* every segment.
|
|
17
|
+
* "cat $(rm -rf /)" → command substitution smuggles anything past any
|
|
18
|
+
* pattern. We reject $(), ``, and <() outright.
|
|
19
|
+
* "cat x > important" → redirection mutates without a mutating command name.
|
|
20
|
+
* We reject >, >>, and their fd forms.
|
|
21
|
+
* "sed -i 's/a/b/' f" → `sed *` is allow-listed in both plugins, but -i
|
|
22
|
+
* rewrites the file in place. Special-cased deny.
|
|
23
|
+
* "awk '{print >"f"}'" → awk and sed both have file-write syntax INSIDE
|
|
24
|
+
* "sed 's/a/b/w f' x" their own script argument. That script is a single
|
|
25
|
+
* quoted shell token, so the shell-level `>` scan
|
|
26
|
+
* above never sees it (worse: it strips the whole
|
|
27
|
+
* quoted span before scanning, precisely so a
|
|
28
|
+
* literal `>` inside a grep pattern isn't misread
|
|
29
|
+
* as a redirect — the same stripping hides a real
|
|
30
|
+
* awk/sed write just as well). Special-cased deny,
|
|
31
|
+
* found and closed after this file had already
|
|
32
|
+
* shipped claiming it was "residual, same as
|
|
33
|
+
* upstream" — it wasn't actually mitigated, only
|
|
34
|
+
* documented as if it were. See check-bash.test.ts.
|
|
35
|
+
*
|
|
36
|
+
* `xargs rm` and `find -delete`/`-exec` are the other two allow-listed-name-
|
|
37
|
+
* but-destructive-payload cases; both are special-cased below. Beyond these,
|
|
38
|
+
* the residual risk is smaller and harder to enumerate (a read-only command
|
|
39
|
+
* with an as-yet-unnoticed side-effecting flag) — which is why the verifier
|
|
40
|
+
* also runs with no edit or write tool at all, as defense in depth rather than
|
|
41
|
+
* relying on this file being exhaustive.
|
|
42
|
+
*
|
|
43
|
+
* A DIFFERENT, non-fixable category: `cargo test`/`npm test`/`pytest`/`go
|
|
44
|
+
* test` are allow-listed by name, but once permitted they execute the
|
|
45
|
+
* project's own test code, build scripts, and proc macros — with the full
|
|
46
|
+
* privileges of this process (network, filesystem writes anywhere the OS user
|
|
47
|
+
* can write, env reads). None of that is visible to or governed by this
|
|
48
|
+
* whitelist; it operates purely on the shell command's syntax, never on what
|
|
49
|
+
* the invoked program does once it starts running. This isn't an oversight to
|
|
50
|
+
* patch — verifying "tests pass" has no meaning without actually running
|
|
51
|
+
* them, so the trust boundary here is identical to running the repo's test
|
|
52
|
+
* suite locally. Don't try to "fix" this file to close it; if that trust
|
|
53
|
+
* boundary is ever wrong for a given use case, the answer is running ralphflow
|
|
54
|
+
* itself inside a container, not tightening this whitelist further.
|
|
55
|
+
*/
|
|
56
|
+
import type { PermissionAction } from "./types.js";
|
|
57
|
+
export declare const CHECK_BASH_TIMEOUT_MS = 120000;
|
|
58
|
+
export interface CheckBashDecision {
|
|
59
|
+
allowed: boolean;
|
|
60
|
+
/** The segment that caused a denial, for the message shown to the model. */
|
|
61
|
+
offendingSegment?: string;
|
|
62
|
+
reason?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface ExtraBashValidation {
|
|
65
|
+
/** Accepted patterns, ready to merge into resolveAction's table as "allow". */
|
|
66
|
+
allowed: Record<string, PermissionAction>;
|
|
67
|
+
/** Patterns refused, with why — surfaced by `ralphflow doctor`. */
|
|
68
|
+
rejected: Array<{
|
|
69
|
+
pattern: string;
|
|
70
|
+
reason: string;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Filter a workflow's `extra_allowed_bash` patterns against NEVER_EXTRA_ALLOWED
|
|
75
|
+
* and basic sanity (must start with a concrete literal, not immediately a
|
|
76
|
+
* wildcard — a bare "*" or "* rm -rf /" pattern would otherwise reopen
|
|
77
|
+
* everything by overriding the table's own `"*": "deny"` fallback).
|
|
78
|
+
*/
|
|
79
|
+
export declare function validateExtraAllowedBash(patterns: string[] | undefined): ExtraBashValidation;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve one command segment against the table. Most-specific match wins:
|
|
82
|
+
* the longest pattern (ignoring wildcards) that matches decides, so `cargo fmt
|
|
83
|
+
* --check*` beats a hypothetical `cargo *`, and the `"*": "deny"` fallback only
|
|
84
|
+
* applies when nothing else matches.
|
|
85
|
+
*/
|
|
86
|
+
export declare function resolveAction(command: string, extra?: Record<string, PermissionAction>): PermissionAction;
|
|
87
|
+
/**
|
|
88
|
+
* Split a command line into the segments that each need to pass the allow-list.
|
|
89
|
+
* Separators: && || ; | & and newlines. Quoted spans are respected so a
|
|
90
|
+
* separator inside a string literal doesn't create a phantom segment.
|
|
91
|
+
*
|
|
92
|
+
* Two `&` forms are NOT separators and must stay inside their segment:
|
|
93
|
+
* `2>&1` (fd dup) — splitting it would strand a bare "2>" that then looks
|
|
94
|
+
* like a write redirection and denies a legal command.
|
|
95
|
+
* `&>file` — bash's redirect-both shorthand; kept whole so the
|
|
96
|
+
* redirection check sees and denies it.
|
|
97
|
+
*/
|
|
98
|
+
export declare function splitSegments(command: string): string[];
|
|
99
|
+
/**
|
|
100
|
+
* Decide whether the verifier may run this command line.
|
|
101
|
+
*
|
|
102
|
+
* `extraAllowedBash` is a workflow's own `adversarial_check.extra_allowed_bash`
|
|
103
|
+
* (raw, unvalidated strings straight from YAML) — always re-validated here via
|
|
104
|
+
* validateExtraAllowedBash rather than trusting a pre-built table, so there is
|
|
105
|
+
* exactly one path into resolveAction's extra table and no way for a future
|
|
106
|
+
* caller to skip the NEVER_EXTRA_ALLOWED filter by constructing one by hand.
|
|
107
|
+
* Every guard below (substitution, write redirection, mutating flags,
|
|
108
|
+
* script-embedded writes) runs BEFORE resolveAction and applies identically
|
|
109
|
+
* regardless of which table allowed the base command — an extra-allowed
|
|
110
|
+
* `./scripts/check.sh` is exactly as constrained by those guards as a
|
|
111
|
+
* built-in `npm test`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function checkCommand(command: string, extraAllowedBash?: string[]): CheckBashDecision;
|
|
114
|
+
export interface CheckBashRunResult {
|
|
115
|
+
output: string;
|
|
116
|
+
exitCode: number | null;
|
|
117
|
+
timedOut: boolean;
|
|
118
|
+
}
|
|
119
|
+
/** Run an already-approved command. Never call without checkCommand passing. */
|
|
120
|
+
export declare function runApprovedCommand(command: string, cwd: string, signal?: AbortSignal): Promise<CheckBashRunResult>;
|
|
121
|
+
//# sourceMappingURL=check-bash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-bash.d.ts","sourceRoot":"","sources":["../../src/engine/check-bash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA2CD,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,mEAAmE;IACnE,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,mBAAmB,CAmB5F;AAYD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,gBAAgB,CAUzG;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBvD;AAsDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAmC5F;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoClH"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The verifier's only shell access: a whitelist-checked bash tool.
|
|
3
|
+
*
|
|
4
|
+
* Why this file exists at all: both plugin versions delegated the read-only
|
|
5
|
+
* guarantee to their host (opencode's agent permission map, Claude's
|
|
6
|
+
* `--allowedTools`). ralph-flow-pi has no host to delegate to, so it enforces
|
|
7
|
+
* the same allow-list itself, right before spawning.
|
|
8
|
+
*
|
|
9
|
+
* The allow-list (RALPH_CHECK_BASH_PERMISSION in core.ts) is a verbatim port.
|
|
10
|
+
* The ENFORCEMENT is deliberately stricter than either plugin, because here we
|
|
11
|
+
* own the executor and a glob match against the whole command string is not a
|
|
12
|
+
* safe primitive:
|
|
13
|
+
*
|
|
14
|
+
* "cat x && rm -rf y" → the plugins glob-match "cat *" and allow the whole
|
|
15
|
+
* string, rm included. We split on &&/||/;/| and check
|
|
16
|
+
* every segment.
|
|
17
|
+
* "cat $(rm -rf /)" → command substitution smuggles anything past any
|
|
18
|
+
* pattern. We reject $(), ``, and <() outright.
|
|
19
|
+
* "cat x > important" → redirection mutates without a mutating command name.
|
|
20
|
+
* We reject >, >>, and their fd forms.
|
|
21
|
+
* "sed -i 's/a/b/' f" → `sed *` is allow-listed in both plugins, but -i
|
|
22
|
+
* rewrites the file in place. Special-cased deny.
|
|
23
|
+
* "awk '{print >"f"}'" → awk and sed both have file-write syntax INSIDE
|
|
24
|
+
* "sed 's/a/b/w f' x" their own script argument. That script is a single
|
|
25
|
+
* quoted shell token, so the shell-level `>` scan
|
|
26
|
+
* above never sees it (worse: it strips the whole
|
|
27
|
+
* quoted span before scanning, precisely so a
|
|
28
|
+
* literal `>` inside a grep pattern isn't misread
|
|
29
|
+
* as a redirect — the same stripping hides a real
|
|
30
|
+
* awk/sed write just as well). Special-cased deny,
|
|
31
|
+
* found and closed after this file had already
|
|
32
|
+
* shipped claiming it was "residual, same as
|
|
33
|
+
* upstream" — it wasn't actually mitigated, only
|
|
34
|
+
* documented as if it were. See check-bash.test.ts.
|
|
35
|
+
*
|
|
36
|
+
* `xargs rm` and `find -delete`/`-exec` are the other two allow-listed-name-
|
|
37
|
+
* but-destructive-payload cases; both are special-cased below. Beyond these,
|
|
38
|
+
* the residual risk is smaller and harder to enumerate (a read-only command
|
|
39
|
+
* with an as-yet-unnoticed side-effecting flag) — which is why the verifier
|
|
40
|
+
* also runs with no edit or write tool at all, as defense in depth rather than
|
|
41
|
+
* relying on this file being exhaustive.
|
|
42
|
+
*
|
|
43
|
+
* A DIFFERENT, non-fixable category: `cargo test`/`npm test`/`pytest`/`go
|
|
44
|
+
* test` are allow-listed by name, but once permitted they execute the
|
|
45
|
+
* project's own test code, build scripts, and proc macros — with the full
|
|
46
|
+
* privileges of this process (network, filesystem writes anywhere the OS user
|
|
47
|
+
* can write, env reads). None of that is visible to or governed by this
|
|
48
|
+
* whitelist; it operates purely on the shell command's syntax, never on what
|
|
49
|
+
* the invoked program does once it starts running. This isn't an oversight to
|
|
50
|
+
* patch — verifying "tests pass" has no meaning without actually running
|
|
51
|
+
* them, so the trust boundary here is identical to running the repo's test
|
|
52
|
+
* suite locally. Don't try to "fix" this file to close it; if that trust
|
|
53
|
+
* boundary is ever wrong for a given use case, the answer is running ralphflow
|
|
54
|
+
* itself inside a container, not tightening this whitelist further.
|
|
55
|
+
*/
|
|
56
|
+
import { spawn } from "child_process";
|
|
57
|
+
import { RALPH_CHECK_BASH_PERMISSION } from "./core.js";
|
|
58
|
+
export const CHECK_BASH_TIMEOUT_MS = 120_000;
|
|
59
|
+
const MAX_OUTPUT_BYTES = 30_000;
|
|
60
|
+
/**
|
|
61
|
+
* Base commands `adversarial_check.extra_allowed_bash` (a workflow's own
|
|
62
|
+
* whitelist additions — see types.ts) can NEVER open, no matter what pattern
|
|
63
|
+
* a workflow YAML asks for. The built-in table above is reviewed and pinned
|
|
64
|
+
* in this repo; a workflow's extra_allowed_bash isn't — it can arrive in a
|
|
65
|
+
* copied/shared YAML file, or be generated by a model designing a workflow
|
|
66
|
+
* via /ralphflow-create, neither of which should be able to reopen `rm`, a
|
|
67
|
+
* shell, an interpreter, or credentialed network access just by asking.
|
|
68
|
+
* Package managers and git are banned too even though some of their
|
|
69
|
+
* subcommands ARE already allow-listed above (`cargo test`, `git diff`, …) —
|
|
70
|
+
* that curation is deliberate per-subcommand and extra_allowed_bash is not a
|
|
71
|
+
* back door around it; a workflow that needs one more specific safe
|
|
72
|
+
* subcommand should get it added to the built-in table instead.
|
|
73
|
+
* Enforced here, at the runtime decision point in resolveAction — not only
|
|
74
|
+
* as a doctor warning, since doctor is advisory and can be skipped.
|
|
75
|
+
*/
|
|
76
|
+
const NEVER_EXTRA_ALLOWED = new Set([
|
|
77
|
+
// Destructive/mutating file ops.
|
|
78
|
+
"rm", "rmdir", "mv", "cp", "ln", "dd", "shred", "truncate", "mkfifo", "mknod",
|
|
79
|
+
// System / process control.
|
|
80
|
+
"shutdown", "reboot", "halt", "poweroff", "kill", "killall", "pkill",
|
|
81
|
+
"systemctl", "service", "crontab", "at", "batch", "chmod", "chown", "chgrp",
|
|
82
|
+
// Network / remote exec — includes the "curl -o file" / "wget -O file"
|
|
83
|
+
// script-embedded-write pattern (see findScriptEmbeddedWrite's awk/sed
|
|
84
|
+
// comment for why a command's OWN write flags are invisible to the
|
|
85
|
+
// shell-level redirection scan).
|
|
86
|
+
"curl", "wget", "ssh", "scp", "sftp", "rsync", "nc", "ncat", "netcat", "telnet", "ftp",
|
|
87
|
+
// Shells / interpreters / eval — the same "smuggle anything past the
|
|
88
|
+
// whitelist" problem $() and `` are banned outright for, just spelled as
|
|
89
|
+
// a command name instead of shell syntax.
|
|
90
|
+
"sh", "bash", "zsh", "ksh", "dash", "fish", "csh", "tcsh", "eval", "exec", "source",
|
|
91
|
+
"python", "python2", "python3", "node", "nodejs", "deno", "bun", "ruby", "perl", "php", "lua", "tclsh",
|
|
92
|
+
// Privilege escalation.
|
|
93
|
+
"sudo", "su", "doas", "env",
|
|
94
|
+
// Containers / orchestration.
|
|
95
|
+
"docker", "podman", "kubectl", "helm",
|
|
96
|
+
// Ecosystem tools already curated per-subcommand in the built-in table —
|
|
97
|
+
// extra_allowed_bash must not widen them.
|
|
98
|
+
"git", "npm", "yarn", "pnpm", "npx", "pip", "pip3", "cargo", "go", "gem", "bundle", "composer", "mvn", "gradle",
|
|
99
|
+
]);
|
|
100
|
+
/**
|
|
101
|
+
* Filter a workflow's `extra_allowed_bash` patterns against NEVER_EXTRA_ALLOWED
|
|
102
|
+
* and basic sanity (must start with a concrete literal, not immediately a
|
|
103
|
+
* wildcard — a bare "*" or "* rm -rf /" pattern would otherwise reopen
|
|
104
|
+
* everything by overriding the table's own `"*": "deny"` fallback).
|
|
105
|
+
*/
|
|
106
|
+
export function validateExtraAllowedBash(patterns) {
|
|
107
|
+
const allowed = {};
|
|
108
|
+
const rejected = [];
|
|
109
|
+
for (const raw of patterns ?? []) {
|
|
110
|
+
const pattern = String(raw ?? "").trim();
|
|
111
|
+
if (!pattern)
|
|
112
|
+
continue;
|
|
113
|
+
const literalHead = pattern.split("*")[0].trim();
|
|
114
|
+
if (!literalHead) {
|
|
115
|
+
rejected.push({ pattern, reason: "过于宽泛:必须以具体命令名开头,不能以通配符开头" });
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const base = literalHead.split(/\s+/)[0].replace(/^\.\//, "").split("/").pop()?.toLowerCase() ?? "";
|
|
119
|
+
if (NEVER_EXTRA_ALLOWED.has(base)) {
|
|
120
|
+
rejected.push({ pattern, reason: `"${base}" 是内置永久拒绝的命令名,写在 extra_allowed_bash 里也不会生效` });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
allowed[pattern] = "allow";
|
|
124
|
+
}
|
|
125
|
+
return { allowed, rejected };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Glob match in the shape the permission table uses: `*` matches any run of
|
|
129
|
+
* characters. Ported from the semantics of opencode's permission matcher —
|
|
130
|
+
* patterns are anchored at both ends.
|
|
131
|
+
*/
|
|
132
|
+
function globMatches(pattern, command) {
|
|
133
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
134
|
+
return new RegExp(`^${escaped}$`, "s").test(command);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Resolve one command segment against the table. Most-specific match wins:
|
|
138
|
+
* the longest pattern (ignoring wildcards) that matches decides, so `cargo fmt
|
|
139
|
+
* --check*` beats a hypothetical `cargo *`, and the `"*": "deny"` fallback only
|
|
140
|
+
* applies when nothing else matches.
|
|
141
|
+
*/
|
|
142
|
+
export function resolveAction(command, extra) {
|
|
143
|
+
const cmd = command.trim();
|
|
144
|
+
let best = null;
|
|
145
|
+
const table = extra ? { ...RALPH_CHECK_BASH_PERMISSION, ...extra } : RALPH_CHECK_BASH_PERMISSION;
|
|
146
|
+
for (const [pattern, action] of Object.entries(table)) {
|
|
147
|
+
if (!globMatches(pattern, cmd))
|
|
148
|
+
continue;
|
|
149
|
+
const specificity = pattern.replace(/\*/g, "").length;
|
|
150
|
+
if (!best || specificity > best.specificity)
|
|
151
|
+
best = { action, specificity };
|
|
152
|
+
}
|
|
153
|
+
return best ? best.action : "deny";
|
|
154
|
+
}
|
|
155
|
+
/** Shell metacharacters that can smuggle a command past any name-based check. */
|
|
156
|
+
const SUBSTITUTION_PATTERNS = [
|
|
157
|
+
{ re: /\$\(/, what: "命令替换 $(...)" },
|
|
158
|
+
{ re: /`/, what: "反引号命令替换" },
|
|
159
|
+
{ re: /<\(/, what: "进程替换 <(...)" },
|
|
160
|
+
{ re: />\(/, what: "进程替换 >(...)" },
|
|
161
|
+
];
|
|
162
|
+
/** Redirection that writes. `2>&1` and `<` (read) are fine; `>`/`>>` are not. */
|
|
163
|
+
function findWriteRedirection(segment) {
|
|
164
|
+
// Strip quoted spans first so a literal ">" inside a grep pattern is not a
|
|
165
|
+
// redirection (e.g. grep -n "a > b" file).
|
|
166
|
+
const unquoted = segment.replace(/'[^']*'/g, "''").replace(/"[^"]*"/g, '""');
|
|
167
|
+
// >&N / N>&N is an fd dup (2>&1), not a file write — allow it.
|
|
168
|
+
const withoutFdDup = unquoted.replace(/\d*>&\d+/g, "");
|
|
169
|
+
const m = withoutFdDup.match(/\d*>>?/);
|
|
170
|
+
return m ? m[0] : null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Split a command line into the segments that each need to pass the allow-list.
|
|
174
|
+
* Separators: && || ; | & and newlines. Quoted spans are respected so a
|
|
175
|
+
* separator inside a string literal doesn't create a phantom segment.
|
|
176
|
+
*
|
|
177
|
+
* Two `&` forms are NOT separators and must stay inside their segment:
|
|
178
|
+
* `2>&1` (fd dup) — splitting it would strand a bare "2>" that then looks
|
|
179
|
+
* like a write redirection and denies a legal command.
|
|
180
|
+
* `&>file` — bash's redirect-both shorthand; kept whole so the
|
|
181
|
+
* redirection check sees and denies it.
|
|
182
|
+
*/
|
|
183
|
+
export function splitSegments(command) {
|
|
184
|
+
const segments = [];
|
|
185
|
+
let current = "";
|
|
186
|
+
let quote = null;
|
|
187
|
+
for (let i = 0; i < command.length; i++) {
|
|
188
|
+
const c = command[i];
|
|
189
|
+
const next = command[i + 1];
|
|
190
|
+
const prev = command[i - 1];
|
|
191
|
+
if (quote) {
|
|
192
|
+
current += c;
|
|
193
|
+
if (c === quote && command[i - 1] !== "\\")
|
|
194
|
+
quote = null;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (c === '"' || c === "'") {
|
|
198
|
+
quote = c;
|
|
199
|
+
current += c;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (c === "\n") {
|
|
203
|
+
segments.push(current);
|
|
204
|
+
current = "";
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (c === ";") {
|
|
208
|
+
segments.push(current);
|
|
209
|
+
current = "";
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (c === "&" && (prev === ">" || next === ">")) {
|
|
213
|
+
current += c;
|
|
214
|
+
continue;
|
|
215
|
+
} // 2>&1 / &>file
|
|
216
|
+
if ((c === "&" || c === "|") && next === c) {
|
|
217
|
+
segments.push(current);
|
|
218
|
+
current = "";
|
|
219
|
+
i++;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (c === "|" || c === "&") {
|
|
223
|
+
segments.push(current);
|
|
224
|
+
current = "";
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
current += c;
|
|
228
|
+
}
|
|
229
|
+
segments.push(current);
|
|
230
|
+
return segments.map((s) => s.trim()).filter(Boolean);
|
|
231
|
+
}
|
|
232
|
+
/** Commands that are allow-listed by name but have a mutating flag. */
|
|
233
|
+
function findMutatingFlag(segment) {
|
|
234
|
+
const s = segment.trim();
|
|
235
|
+
// `sed -i` / `sed --in-place` rewrite files in place. Both plugins allow bare
|
|
236
|
+
// `sed *`; we carve this out (recorded as an intentional divergence in SYNC.md).
|
|
237
|
+
if (/^sed\b/.test(s) && /(^|\s)(-i\b|--in-place\b|-[a-zA-Z]*i[a-zA-Z]*\b(?!\S))/.test(s))
|
|
238
|
+
return "sed -i(原地改写文件)";
|
|
239
|
+
// `find -delete` / `-exec rm` mutate despite `find *` being allow-listed.
|
|
240
|
+
if (/^find\b/.test(s) && /(^|\s)-delete\b/.test(s))
|
|
241
|
+
return "find -delete";
|
|
242
|
+
if (/^find\b/.test(s) && /(^|\s)-(exec|execdir|ok|okdir)\b/.test(s))
|
|
243
|
+
return "find -exec(可执行任意命令)";
|
|
244
|
+
// `xargs rm`-style: the payload command must itself be allow-listed.
|
|
245
|
+
if (/^xargs\b/.test(s)) {
|
|
246
|
+
const payload = s.replace(/^xargs\s+(-[^\s]+\s+)*/, "").trim();
|
|
247
|
+
if (payload && resolveAction(payload) !== "allow")
|
|
248
|
+
return `xargs 的目标命令「${payload}」不在只读白名单内`;
|
|
249
|
+
}
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* awk and sed both have their OWN write syntax inside their script argument —
|
|
254
|
+
* `awk 'BEGIN{print "x" > "file"}'` and `sed 's/a/b/w file'` — which never
|
|
255
|
+
* reaches the shell as a redirection token, so findWriteRedirection's
|
|
256
|
+
* shell-level `>` scan (which deliberately strips quoted spans so a literal
|
|
257
|
+
* `>` inside a grep pattern isn't misread as a redirect) cannot see it: from
|
|
258
|
+
* the shell's point of view the whole script is just one quoted string
|
|
259
|
+
* argument. Both commands are allow-listed for their genuinely common
|
|
260
|
+
* read-only uses (`awk '{print $1}'`, `sed -n '1,10p'`), so the fix has to
|
|
261
|
+
* look inside the script rather than deny the command outright.
|
|
262
|
+
*
|
|
263
|
+
* Conservative on purpose: this also denies awk's legitimate numeric `>`
|
|
264
|
+
* comparisons (e.g. `awk '$3 > 100'`) and any sed script containing a bare
|
|
265
|
+
* `w` token, which is a real false-positive cost. For a verifier whose entire
|
|
266
|
+
* point is "cannot mutate the workspace it is judging," failing closed on an
|
|
267
|
+
* ambiguous case is the correct tradeoff — same posture as the blanket
|
|
268
|
+
* `sed -i` denial just above, which doesn't try to prove `-i` is destructive
|
|
269
|
+
* either.
|
|
270
|
+
*/
|
|
271
|
+
function findScriptEmbeddedWrite(segment) {
|
|
272
|
+
const s = segment.trim();
|
|
273
|
+
if (/^(g|n|m)?awk\b/.test(s) && />/.test(s)) {
|
|
274
|
+
return "awk 脚本内包含 `>`:可能是 print/printf 的输出重定向,awk 能借此写文件";
|
|
275
|
+
}
|
|
276
|
+
// Requires real whitespace between `w` and its filename (sed's actual
|
|
277
|
+
// syntax) so a word ending in "w" followed by more text ("below file.txt")
|
|
278
|
+
// doesn't false-positive; only excludes a LETTER immediately before `w`
|
|
279
|
+
// (not a digit), because the address form (`5w file`, `1,5w file`) has a
|
|
280
|
+
// number directly abutting `w` with no separator at all.
|
|
281
|
+
if (/^g?sed\b/.test(s) && /(^|[^A-Za-z])w\s+\S/.test(s.replace(/^g?sed\b/, ""))) {
|
|
282
|
+
return "sed 脚本内包含 `w` 写命令:sed 能借此把匹配行写入文件";
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Decide whether the verifier may run this command line.
|
|
288
|
+
*
|
|
289
|
+
* `extraAllowedBash` is a workflow's own `adversarial_check.extra_allowed_bash`
|
|
290
|
+
* (raw, unvalidated strings straight from YAML) — always re-validated here via
|
|
291
|
+
* validateExtraAllowedBash rather than trusting a pre-built table, so there is
|
|
292
|
+
* exactly one path into resolveAction's extra table and no way for a future
|
|
293
|
+
* caller to skip the NEVER_EXTRA_ALLOWED filter by constructing one by hand.
|
|
294
|
+
* Every guard below (substitution, write redirection, mutating flags,
|
|
295
|
+
* script-embedded writes) runs BEFORE resolveAction and applies identically
|
|
296
|
+
* regardless of which table allowed the base command — an extra-allowed
|
|
297
|
+
* `./scripts/check.sh` is exactly as constrained by those guards as a
|
|
298
|
+
* built-in `npm test`.
|
|
299
|
+
*/
|
|
300
|
+
export function checkCommand(command, extraAllowedBash) {
|
|
301
|
+
const raw = String(command ?? "").trim();
|
|
302
|
+
if (!raw)
|
|
303
|
+
return { allowed: false, reason: "命令为空" };
|
|
304
|
+
for (const { re, what } of SUBSTITUTION_PATTERNS) {
|
|
305
|
+
if (re.test(raw)) {
|
|
306
|
+
return { allowed: false, reason: `禁止${what}:它可以绕过只读白名单执行任意命令` };
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
const segments = splitSegments(raw);
|
|
310
|
+
if (segments.length === 0)
|
|
311
|
+
return { allowed: false, reason: "命令为空" };
|
|
312
|
+
const extra = extraAllowedBash && extraAllowedBash.length > 0
|
|
313
|
+
? validateExtraAllowedBash(extraAllowedBash).allowed
|
|
314
|
+
: undefined;
|
|
315
|
+
for (const segment of segments) {
|
|
316
|
+
const redirection = findWriteRedirection(segment);
|
|
317
|
+
if (redirection) {
|
|
318
|
+
return { allowed: false, offendingSegment: segment, reason: `禁止写重定向 \`${redirection}\`:验证者不能修改它正在评判的工作区` };
|
|
319
|
+
}
|
|
320
|
+
const mutating = findMutatingFlag(segment);
|
|
321
|
+
if (mutating) {
|
|
322
|
+
return { allowed: false, offendingSegment: segment, reason: `禁止 ${mutating}` };
|
|
323
|
+
}
|
|
324
|
+
const scriptWrite = findScriptEmbeddedWrite(segment);
|
|
325
|
+
if (scriptWrite) {
|
|
326
|
+
return { allowed: false, offendingSegment: segment, reason: `禁止 ${scriptWrite}` };
|
|
327
|
+
}
|
|
328
|
+
if (resolveAction(segment, extra) !== "allow") {
|
|
329
|
+
return { allowed: false, offendingSegment: segment, reason: `命令不在只读白名单内` };
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return { allowed: true };
|
|
333
|
+
}
|
|
334
|
+
/** Run an already-approved command. Never call without checkCommand passing. */
|
|
335
|
+
export function runApprovedCommand(command, cwd, signal) {
|
|
336
|
+
return new Promise((resolve) => {
|
|
337
|
+
const child = spawn(command, { cwd, shell: true, signal });
|
|
338
|
+
let out = "";
|
|
339
|
+
let truncated = false;
|
|
340
|
+
let timedOut = false;
|
|
341
|
+
const append = (chunk) => {
|
|
342
|
+
if (truncated)
|
|
343
|
+
return;
|
|
344
|
+
out += chunk.toString("utf-8");
|
|
345
|
+
if (out.length > MAX_OUTPUT_BYTES) {
|
|
346
|
+
out = out.slice(0, MAX_OUTPUT_BYTES) + `\n…(输出超过 ${MAX_OUTPUT_BYTES} 字节,已截断)`;
|
|
347
|
+
truncated = true;
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
child.stdout?.on("data", append);
|
|
351
|
+
child.stderr?.on("data", append);
|
|
352
|
+
const timer = setTimeout(() => {
|
|
353
|
+
timedOut = true;
|
|
354
|
+
try {
|
|
355
|
+
child.kill("SIGKILL");
|
|
356
|
+
}
|
|
357
|
+
catch { }
|
|
358
|
+
}, CHECK_BASH_TIMEOUT_MS);
|
|
359
|
+
child.on("error", (e) => {
|
|
360
|
+
clearTimeout(timer);
|
|
361
|
+
resolve({ output: out + `\n命令执行失败:${e.message}`, exitCode: null, timedOut });
|
|
362
|
+
});
|
|
363
|
+
child.on("close", (code) => {
|
|
364
|
+
clearTimeout(timer);
|
|
365
|
+
resolve({
|
|
366
|
+
output: timedOut ? out + `\n命令超时(>${CHECK_BASH_TIMEOUT_MS / 1000}s),已终止` : out,
|
|
367
|
+
exitCode: code,
|
|
368
|
+
timedOut,
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=check-bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-bash.js","sourceRoot":"","sources":["../../src/engine/check-bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adversarial Check (Independent Verification) — Pi adapter.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the contract of both plugin versions' adversarialCheck: same inputs,
|
|
5
|
+
* same `{ passed, infra?, reason }` result, same infra-vs-work-failure
|
|
6
|
+
* classification (an infra result pauses with check_error and does NOT burn a
|
|
7
|
+
* failure count, so `ralphflow_continue` re-verifies for free).
|
|
8
|
+
*
|
|
9
|
+
* The execution vehicle is what differs. The Claude version spawned
|
|
10
|
+
* `claude -p --allowedTools "…"`; the opencode version opened an SDK session
|
|
11
|
+
* with the read-only `ralph-check` agent. Here the verifier is a fresh Pi
|
|
12
|
+
* session that is read-only *structurally*: it gets Pi's read-only built-ins
|
|
13
|
+
* (read/grep/find/ls — no bash, no edit, no write) plus exactly two custom
|
|
14
|
+
* tools, `check_bash` (whitelist-enforced) and `verdict`. There is no host
|
|
15
|
+
* permission layer to misconfigure, and no prompt asking the model to please
|
|
16
|
+
* not write.
|
|
17
|
+
*
|
|
18
|
+
* The verdict likewise moved from prose to a tool call: the plugins parsed
|
|
19
|
+
* `<promise-check>true</promise-check>` off the last line, which meant a model
|
|
20
|
+
* that reasoned past its own tag, or fenced it, silently read as "false".
|
|
21
|
+
*
|
|
22
|
+
* Cancellation: the check session's JSONL path is written to the instance dir
|
|
23
|
+
* (.adversarial-session — counterpart of the Claude version's .adversarial-pid)
|
|
24
|
+
* and an abort handle is registered in-process so destroyInstance can reach it.
|
|
25
|
+
* A check owned by ANOTHER process cannot be reached from here; its result is
|
|
26
|
+
* discarded by the caller's post-check state re-read.
|
|
27
|
+
*/
|
|
28
|
+
import { type Engine } from "./core.js";
|
|
29
|
+
import type { AdversarialCheckConfig, CheckResult, NormalStepDef } from "./types.js";
|
|
30
|
+
import { createCheckSession, type StepEvent } from "../pi/adapter.js";
|
|
31
|
+
/** Abort a still-running check for an instance (in-process only). */
|
|
32
|
+
export declare function abortActiveCheck(instId: string): void;
|
|
33
|
+
export declare function hasActiveCheck(instId: string): boolean;
|
|
34
|
+
/** Seam for tests: swap in a scripted session instead of a real model call. */
|
|
35
|
+
export type CheckSessionFactory = typeof createCheckSession;
|
|
36
|
+
export interface AdversarialCheckDeps {
|
|
37
|
+
createSession?: CheckSessionFactory;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run the independent verification for a step. `checkPrompt` is built by the
|
|
41
|
+
* caller (with the explicit instId) and passed in, so this function needs no
|
|
42
|
+
* instance binding of its own.
|
|
43
|
+
*/
|
|
44
|
+
export declare function adversarialCheck(engine: Engine, instId: string, step: NormalStepDef, checkPrompt: string, userTask: string | undefined, adversarialConfig?: AdversarialCheckConfig, onBashEvent?: (line: string) => void, deps?: AdversarialCheckDeps,
|
|
45
|
+
/** Live stream of the verifier session (reasoning / text / tool calls) for the run view. */
|
|
46
|
+
onEvent?: (event: StepEvent) => void): Promise<CheckResult>;
|
|
47
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/engine/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EACL,kBAAkB,EAIlB,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAC;AAS1B,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAcrD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAoFD,+EAA+E;AAC/E,MAAM,MAAM,mBAAmB,GAAG,OAAO,kBAAkB,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,iBAAiB,CAAC,EAAE,sBAAsB,EAC1C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACpC,IAAI,CAAC,EAAE,oBAAoB;AAC3B,4FAA4F;AAC5F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACnC,OAAO,CAAC,WAAW,CAAC,CAwKtB"}
|