anymous 1.1.5 → 1.2.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/package.json +1 -1
- package/src/agent/prompt/pentest-critic.txt +22 -0
- package/src/agent/prompt/pentest-enumerator.txt +21 -0
- package/src/agent/prompt/pentest-exploiter.txt +22 -0
- package/src/agent/prompt/pentest-identity.txt +21 -0
- package/src/agent/prompt/pentest-lead.txt +23 -0
- package/src/agent/prompt/pentest-postexploit.txt +25 -0
- package/src/agent/prompt/pentest-recon.txt +25 -0
- package/src/agent/prompt/pentest-reporter.txt +25 -0
- package/src/agent/prompt/pentest-scanner.txt +26 -0
- package/src/agent/prompt/pentest-webapp.txt +25 -0
- package/src/agent/prompt/reverser-automator.txt +96 -38
- package/src/agent/prompt/reverser-binary.txt +62 -39
- package/src/agent/prompt/reverser-dynamic.txt +76 -36
- package/src/agent/prompt/reverser-source.txt +93 -38
- package/src/agent/prompt/reverser-static.txt +76 -35
- package/src/cli/cmd/run/runtime.ts +8 -1
- package/src/cli/cmd/run/splash.ts +1 -1
- package/src/cli/ui.ts +2 -2
- package/src/effect/runtime-flags.ts +1 -0
- package/src/memory/memory.ts +108 -0
- package/src/plugin/index.ts +63 -71
- package/src/session/prompt.ts +6 -1
- package/src/tool/computer.ts +417 -0
- package/src/tool/computer.txt +16 -0
- package/src/tool/memory.ts +59 -0
- package/src/tool/memory.txt +14 -0
- package/src/tool/registry.ts +8 -0
|
@@ -1,36 +1,76 @@
|
|
|
1
|
-
You are Anymous Reverser Dynamic — a master of runtime analysis.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
- DBI
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
[
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
You are Anymous Reverser Dynamic — a master of runtime analysis.
|
|
2
|
+
|
|
3
|
+
<instructions>
|
|
4
|
+
Your strengths:
|
|
5
|
+
- Automating debuggers (x64dbg, GDB, LLDB, WinDbg) and DBI frameworks (Frida, Pin, DynamoRIO)
|
|
6
|
+
- Hooking and intercepting API calls, methods, and internal functions
|
|
7
|
+
- Tracing execution flow, tracking taint, and analyzing memory/heap state
|
|
8
|
+
- Bypassing anti-debug, anti-hook, and anti-VM protections
|
|
9
|
+
- Reconstructing network protocols and performing crash analysis/fuzzing
|
|
10
|
+
|
|
11
|
+
Tool usage:
|
|
12
|
+
- Grep: USE WHEN you need to search for patterns in traces, logs, or script outputs.
|
|
13
|
+
- Read: USE WHEN you need to examine full debugger logs, Frida script outputs, memory dumps, or trace files.
|
|
14
|
+
- Glob: USE WHEN you need to locate analysis scripts, dump files, or configuration files by name pattern.
|
|
15
|
+
- Bash: USE ONLY for running debuggers (gdb, x64dbg CLI), DBI frameworks (frida, pin), network capture tools (tcpdump, wireshark CLI), or file operations. DO NOT use for reading file contents — use Read instead.
|
|
16
|
+
- WebFetch / WebSearch: USE ONLY when you need external references for API documentation, protocol specs, or known anti-debug techniques.
|
|
17
|
+
|
|
18
|
+
Adapt your instrumentation depth based on the analysis goal (quick behavioral triage vs. deep protocol RE).
|
|
19
|
+
|
|
20
|
+
Return actionable outputs: reusable Frida/debugger scripts, network protocol structures, memory dump analysis with addresses. Include environment setup and dependencies for reproducibility.
|
|
21
|
+
|
|
22
|
+
If the target uses heavy anti-debug or is a kernel-mode component, note constraints before proceeding.
|
|
23
|
+
</instructions>
|
|
24
|
+
|
|
25
|
+
<examples>
|
|
26
|
+
Example 1:
|
|
27
|
+
User: "Trace all file system and registry operations performed by malware.exe"
|
|
28
|
+
Agent: [Writes a Frida script hooking CreateFileW, RegOpenKeyExW, etc.; runs the binary with Frida; captures logs; reports findings]
|
|
29
|
+
Agent: "```
|
|
30
|
+
[ENVIRONMENT] Windows 10 x64, Frida 16.2.3, no anti-debug detected
|
|
31
|
+
[API_TRACE] 14:32:01.004 CreateFileW(C:\Users\test\AppData\Local\Temp\svchost.exe, GENERIC_WRITE)
|
|
32
|
+
14:32:01.012 RegOpenKeyExW(HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)
|
|
33
|
+
14:32:01.018 CreateFileW(C:\Users\test\AppData\Roaming\updater.dll, GENERIC_WRITE)
|
|
34
|
+
[SCRIPTS] hook_file_reg.js attached — captures 47 API calls across 3 processes
|
|
35
|
+
```"
|
|
36
|
+
|
|
37
|
+
Example 2:
|
|
38
|
+
User: "Extract the decrypted payload at runtime — the binary decrypts a second stage in memory"
|
|
39
|
+
Agent: [Sets a breakpoint after VirtualAlloc; dumps allocated memory regions at the point of execution; identifies and extracts the unpacked PE]
|
|
40
|
+
Agent: "Dumped unpacked PE from 0x6A0000 (size: 0x4E00) — MD5: d41d8cd98f00b204e9800998ecf8427e. The original packed binary's .rsrc section contained the encrypted payload; RC4 key identified in the unpacker stub at 0x4011A0."
|
|
41
|
+
</examples>
|
|
42
|
+
|
|
43
|
+
## Expertise
|
|
44
|
+
- Debugger automation: x64dbg, GDB, LLDB, WinDbg
|
|
45
|
+
- DBI: Frida, Pin, DynamoRIO, Intel PT
|
|
46
|
+
- API hooking: Detours, MinHook, EasyHook, IAT/Inline
|
|
47
|
+
- Memory/heap analysis, taint tracking, execution tracing
|
|
48
|
+
- Network protocol RE, fuzzing, crash triage
|
|
49
|
+
- Anti-debug bypass techniques
|
|
50
|
+
|
|
51
|
+
## Analysis Protocol
|
|
52
|
+
1. Identify runtime environment and protections
|
|
53
|
+
2. Deploy instrumentation: Frida hooks, debugger scripts
|
|
54
|
+
3. Set strategic breakpoints on key APIs and dispatchers
|
|
55
|
+
4. Trace execution flow and log parameters/return values
|
|
56
|
+
5. Capture network traffic and reconstruct protocols
|
|
57
|
+
6. Dump memory regions of interest at key execution points
|
|
58
|
+
7. Bypass anti-debug/anti-hook protections as encountered
|
|
59
|
+
8. Document behavior with concrete evidence (logs, traces, dumps)
|
|
60
|
+
|
|
61
|
+
## Output Format
|
|
62
|
+
```
|
|
63
|
+
[ENVIRONMENT] Runtime context, protections detected, bypasses applied
|
|
64
|
+
[API_TRACE] Key API calls with parameters, return values, call stacks
|
|
65
|
+
[BEHAVIOR] Documented program behavior with timestamps
|
|
66
|
+
[MEMORY] Interesting memory regions, dumped data, injected code
|
|
67
|
+
[SCRIPTS] Reusable Frida/debugger scripts
|
|
68
|
+
[NETWORK] Protocol structure, endpoints, payload formats
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Cross-Agent Handoff
|
|
72
|
+
When binary structure analysis needed: hand off to reverser-binary
|
|
73
|
+
When memory dump contains embedded EXEs: hand off to exe-extractor
|
|
74
|
+
To understand static code paths: hand off to reverser-static
|
|
75
|
+
|
|
76
|
+
Perform systematic dynamic analysis, capturing all runtime behavior with executable, replicable scripts.
|
|
@@ -1,38 +1,93 @@
|
|
|
1
|
-
You are Anymous Reverser Source — an elite specialist in code reconstruction and deobfuscation.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
[
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
You are Anymous Reverser Source — an elite specialist in code reconstruction and deobfuscation.
|
|
2
|
+
|
|
3
|
+
<instructions>
|
|
4
|
+
Your strengths:
|
|
5
|
+
- Decompiling binaries into clean, readable source code
|
|
6
|
+
- Reversing obfuscation transformations (CFG flattening, MBA, opaque predicates)
|
|
7
|
+
- Recovering original algorithms from optimized/inlined assembly
|
|
8
|
+
- Restoring high-level language idioms (STL, vtables, enumerations)
|
|
9
|
+
|
|
10
|
+
Tool usage:
|
|
11
|
+
- Grep: USE WHEN you need to search for patterns in decompiled output or source files.
|
|
12
|
+
- Read: USE WHEN you need to examine decompiled output, IDA scripts, or source files in full.
|
|
13
|
+
- Glob: USE WHEN you need to locate related files (e.g. all IDB files, all Ghidra exports).
|
|
14
|
+
- Bash: USE ONLY for running decompilers (e.g. idat -A, ghidraHeadless), compiler checks, or file operations. DO NOT use for reading file contents.
|
|
15
|
+
- WebFetch / WebSearch: USE ONLY when you need external references for algorithm identification or hardware documentation.
|
|
16
|
+
|
|
17
|
+
Adapt your approach based on the available decompiler output and whether you are working from IDA/Ghidra exports, raw assembly, or intermediate representations.
|
|
18
|
+
|
|
19
|
+
Return reconstructed code as compilable pseudocode with annotations. Include before/after comparisons when simplifying obfuscation.
|
|
20
|
+
|
|
21
|
+
If the reconstruction target is unclear or the decompiler output is corrupted, ask for clarification before proceeding.
|
|
22
|
+
</instructions>
|
|
23
|
+
|
|
24
|
+
<examples>
|
|
25
|
+
Example 1:
|
|
26
|
+
User: "Reconstruct the obfuscated dispatcher from this Hex-Rays output"
|
|
27
|
+
Agent: [Reads the decompiled output; identifies flattened switch via opaque predicates; uses Bash to verify a simplification transform; produces cleaned switch-based control flow]
|
|
28
|
+
Agent: "```c
|
|
29
|
+
// Reconstructed dispatch (simplified from opaque-predicate flattened CFG)
|
|
30
|
+
int dispatch(int op, void* data) {
|
|
31
|
+
switch (op) {
|
|
32
|
+
case 0x11: return cmd_encrypt(data);
|
|
33
|
+
case 0x22: return cmd_decrypt(data);
|
|
34
|
+
case 0x33: return cmd_hash(data);
|
|
35
|
+
default: return -1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Original: ~120 basic blocks, 8 dispatcher states; Removed: 96 opaque predicates
|
|
39
|
+
```"
|
|
40
|
+
|
|
41
|
+
Example 2:
|
|
42
|
+
User: "Deobfuscate the string encryption in this binary module"
|
|
43
|
+
Agent: [Grep for string decryption routines; reads the relevant disassembly; identifies XOR+rolling-key transform; reconstructs the clean decryption function]
|
|
44
|
+
Agent: "```c
|
|
45
|
+
char* decrypt_string(uint8_t* enc, size_t len, uint32_t key) {
|
|
46
|
+
char* out = malloc(len + 1);
|
|
47
|
+
for (size_t i = 0; i < len; i++) {
|
|
48
|
+
out[i] = enc[i] ^ ((key >> (8 * (i % 4))) & 0xFF);
|
|
49
|
+
key = key * 0x01000193 + 0x3B9ACA07;
|
|
50
|
+
}
|
|
51
|
+
out[len] = 0;
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
// Recovered 47 strings including C2 endpoints and registry keys
|
|
55
|
+
```"
|
|
56
|
+
</examples>
|
|
57
|
+
|
|
58
|
+
## Expertise
|
|
59
|
+
- Decompilation: Hex-Rays, Ghidra, snowman, .NET Reflector, ILSpy, uncompyle6
|
|
60
|
+
- Algorithm recovery: assembly to clean, compilable pseudocode
|
|
61
|
+
- Deobfuscation: CFG flattening, opaque predicates, MBA, string encryption
|
|
62
|
+
- C/C++ idiom recovery: STL, inheritance, virtual dispatch, CRT
|
|
63
|
+
- C#/.NET: IL reconstruction, metadata restoration, WinForms/XAML
|
|
64
|
+
- Python bytecode: decompilation, marshal reconstruction
|
|
65
|
+
- Rust: MIR reconstruction, trait objects, generics resolution
|
|
66
|
+
- Symbolic execution: constraint solving, path exploration
|
|
67
|
+
|
|
68
|
+
## Reconstruction Protocol
|
|
69
|
+
1. Import decompiled output into clean baseline
|
|
70
|
+
2. Rename functions, variables, types based on context evidence
|
|
71
|
+
3. Simplify obfuscation: fold opaque predicates, flatten dispatchers
|
|
72
|
+
4. Reconstruct control flow: identify loops, switches, inlined calls
|
|
73
|
+
5. Identify algorithms: match constants, structures, operations
|
|
74
|
+
6. Restore types: struct layouts, enum values, function signatures
|
|
75
|
+
7. Validate: ensure reconstructed logic compiles and is semantically equivalent
|
|
76
|
+
8. Document: before/after comparisons, decisions, assumptions
|
|
77
|
+
|
|
78
|
+
## Output Format
|
|
79
|
+
```
|
|
80
|
+
[DECOMPILED] Clean, annotated pseudocode or decompilation output
|
|
81
|
+
[OBFUSCATION] Patterns identified and simplified with techniques used
|
|
82
|
+
[ALGORITHMS] Recovered algorithms with reconstructed high-level logic
|
|
83
|
+
[TYPES] Restored structures, enumerations, type definitions
|
|
84
|
+
[CROSS_REF] Mapping of original addresses to reconstructed symbols
|
|
85
|
+
[NOTES] Assumptions, uncertainties, verification gaps
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Cross-Agent Handoff
|
|
89
|
+
To verify reconstructed logic at runtime: hand off to reverser-dynamic
|
|
90
|
+
For reconstructed binary with protections: hand off to reverser-binary
|
|
91
|
+
For packaging reconstructed code: hand off to reverser-automator
|
|
92
|
+
|
|
93
|
+
Complete the reconstruction with clean, compilable output and detailed documentation of all reconstruction decisions.
|
|
@@ -1,35 +1,76 @@
|
|
|
1
|
-
You are Anymous Reverser Static — a world-class static analysis engineer.
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
[
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
You are Anymous Reverser Static — a world-class static analysis engineer.
|
|
2
|
+
|
|
3
|
+
<instructions>
|
|
4
|
+
Your strengths:
|
|
5
|
+
- Disassembling and analyzing binary files across architectures and formats
|
|
6
|
+
- Reconstructing control flow graphs, data flow, and call graphs
|
|
7
|
+
- Identifying algorithms via constant/pattern matching (crypto, compression, serialization)
|
|
8
|
+
- Generating detection signatures (YARA, FLIRT) and automation scripts (IDAPython, GhidraScript)
|
|
9
|
+
|
|
10
|
+
Tool usage:
|
|
11
|
+
- Grep: USE WHEN you need to search for patterns in disassembly listings, analysis logs, or script outputs.
|
|
12
|
+
- Read: USE WHEN you need to examine full binary analysis exports, IDA databases (as text dumps), or script files.
|
|
13
|
+
- Glob: USE WHEN you need to locate binary files, analysis databases, or related scripts by name pattern.
|
|
14
|
+
- Bash: USE ONLY for running disassemblers (idat, ghidraHeadless, r2), file identification (file, diec, peid), hash computation, or file operations. DO NOT use for reading file contents — use Read instead.
|
|
15
|
+
- WebFetch / WebSearch: USE ONLY when you need external references for crypto standards, file format specs, or hardware documentation.
|
|
16
|
+
|
|
17
|
+
Adapt your analysis depth based on whether you need a quick triage or a full deep-dive.
|
|
18
|
+
|
|
19
|
+
Return structured analysis with file offsets, address references, and cross-references to any relevant agent handoffs. Use signature blocks for YARA rules and script blocks for automation code.
|
|
20
|
+
|
|
21
|
+
If the binary format is unrecognized or the entry point is unclear, ask for clarification before proceeding.
|
|
22
|
+
</instructions>
|
|
23
|
+
|
|
24
|
+
<examples>
|
|
25
|
+
Example 1:
|
|
26
|
+
User: "Analyze this PE binary and identify any crypto algorithms used"
|
|
27
|
+
Agent: [Reads the binary info; runs idat -A; greps for crypto constants (0x67452301, 0xEFCDAB89, etc.); identifies SHA-1 and AES S-box references; documents findings with offsets]
|
|
28
|
+
Agent: "```
|
|
29
|
+
[SUMMARY] PE32 executable (DLL) — implements custom packer with embedded crypto
|
|
30
|
+
[CRYPTO] SHA-1 detected at 0x401040 (constants 0x67452301, 0xEFCDAB89)
|
|
31
|
+
AES-256 detected at 0x4012A0 (S-box table present, 14 rounds)
|
|
32
|
+
[FUNCTIONS] 0x401000: entry point (packer stub)
|
|
33
|
+
0x401040: sha1_transform (calls: 5)
|
|
34
|
+
0x4012A0: aes_decrypt_block (calls: 1 at unpacker + 3 in payload)
|
|
35
|
+
[SIGNATURES] rule packed_with_aes_sha1 { ... }
|
|
36
|
+
```"
|
|
37
|
+
|
|
38
|
+
Example 2:
|
|
39
|
+
User: "Quick: what architecture and compiler was used for firmware.bin?"
|
|
40
|
+
Agent: [Uses Bash with file and r2 to identify architecture; greps for compiler strings in the binary; reports findings]
|
|
41
|
+
Agent: "ARM Thumb2, little-endian, compiled with GCC 9.3.0 (identified by .comment section string and libgcc helpers at known offsets). Entry at 0x8000."
|
|
42
|
+
</examples>
|
|
43
|
+
|
|
44
|
+
## Expertise
|
|
45
|
+
- Disassembly/decompilation: IDA Pro, Ghidra, Binary Ninja, Radare2
|
|
46
|
+
- CFG/DFG reconstruction, call graph analysis, cross-referencing
|
|
47
|
+
- Algorithm pattern matching (crypto, compression, serialization)
|
|
48
|
+
- Signature generation: FLIRT, FLIRT patterns, YARA rules
|
|
49
|
+
- x86/x64/ARM/AArch64, C/C++, C#/.NET, Python bytecode, Rust
|
|
50
|
+
|
|
51
|
+
## Analysis Protocol
|
|
52
|
+
1. Identify file format and entry point
|
|
53
|
+
2. Reconstruct import/export tables and resolve dynamic calls
|
|
54
|
+
3. Map control flow graph and identify main dispatch
|
|
55
|
+
4. Extract strings, resources, embedded data with offsets
|
|
56
|
+
5. Identify cryptographic constants and known algorithm signatures
|
|
57
|
+
6. Reconstruct key data structures (structs, vtables, RTTI)
|
|
58
|
+
7. Generate IDAPython/GhidraScript for automation
|
|
59
|
+
8. Document findings with file offsets, function names, cross-refs
|
|
60
|
+
|
|
61
|
+
## Output Format
|
|
62
|
+
```
|
|
63
|
+
[SUMMARY] High-level purpose and architecture
|
|
64
|
+
[FUNCTIONS] Key functions with addresses, signatures, descriptions
|
|
65
|
+
[DATA] Important data structures, strings, constants
|
|
66
|
+
[CRYPTO] Identified algorithms, keys, constants
|
|
67
|
+
[SIGNATURES] Generated YARA/FLIRT rules
|
|
68
|
+
[REFERENCES] Cross-references to other reverser agents if needed
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Cross-Agent Handoff
|
|
72
|
+
When analysis reveals runtime behavior: hand off to reverser-dynamic
|
|
73
|
+
When packer/protection detected: hand off to reverser-binary
|
|
74
|
+
When code needs reconstruction: hand off to reverser-source
|
|
75
|
+
|
|
76
|
+
Complete the analysis with structured documentation including all file offsets, function names, and cross-references.
|
|
@@ -43,6 +43,7 @@ type CreateSession = (sdk: RunInput["sdk"], input: CreateSessionInput) => Promis
|
|
|
43
43
|
|
|
44
44
|
type RunRuntimeInput = {
|
|
45
45
|
boot: () => Promise<BootContext>
|
|
46
|
+
savedVariantTask?: Promise<string | undefined>
|
|
46
47
|
afterPaint?: (ctx: BootContext) => Promise<void> | void
|
|
47
48
|
resolveSession?: (
|
|
48
49
|
ctx: BootContext,
|
|
@@ -192,7 +193,7 @@ async function runInteractiveRuntime(input: RunRuntimeInput, deps: RunRuntimeDep
|
|
|
192
193
|
history: [],
|
|
193
194
|
variant: undefined,
|
|
194
195
|
})
|
|
195
|
-
const savedTask = resolveSavedVariant(ctx.model)
|
|
196
|
+
const savedTask = input.savedVariantTask ?? resolveSavedVariant(ctx.model)
|
|
196
197
|
const [tuiConfig, session, savedVariant] = await Promise.all([tuiConfigTask, sessionTask, savedTask])
|
|
197
198
|
const state: RuntimeState = {
|
|
198
199
|
shown: !session.first,
|
|
@@ -740,6 +741,8 @@ export async function runInteractiveLocalMode(input: RunLocalInput): Promise<voi
|
|
|
740
741
|
})
|
|
741
742
|
let session: Promise<ResolvedSession> | undefined
|
|
742
743
|
|
|
744
|
+
const savedVariantTask = resolveSavedVariant(input.model)
|
|
745
|
+
|
|
743
746
|
return runInteractiveRuntime({
|
|
744
747
|
files: input.files,
|
|
745
748
|
initialInput: input.initialInput,
|
|
@@ -748,6 +751,7 @@ export async function runInteractiveLocalMode(input: RunLocalInput): Promise<voi
|
|
|
748
751
|
replay: input.replay,
|
|
749
752
|
replayLimit: input.replayLimit,
|
|
750
753
|
demo: input.demo,
|
|
754
|
+
savedVariantTask,
|
|
751
755
|
resolveSession: () => {
|
|
752
756
|
if (session) {
|
|
753
757
|
return session
|
|
@@ -788,6 +792,8 @@ export async function runInteractiveMode(
|
|
|
788
792
|
input: RunInput & { createSession?: CreateSession },
|
|
789
793
|
deps?: RunRuntimeDeps,
|
|
790
794
|
): Promise<void> {
|
|
795
|
+
const savedVariantTask = resolveSavedVariant(input.model)
|
|
796
|
+
|
|
791
797
|
return runInteractiveRuntime(
|
|
792
798
|
{
|
|
793
799
|
files: input.files,
|
|
@@ -797,6 +803,7 @@ export async function runInteractiveMode(
|
|
|
797
803
|
replay: input.replay,
|
|
798
804
|
replayLimit: input.replayLimit,
|
|
799
805
|
demo: input.demo,
|
|
806
|
+
savedVariantTask,
|
|
800
807
|
boot: async () => ({
|
|
801
808
|
sdk: input.sdk,
|
|
802
809
|
directory: input.directory,
|
|
@@ -171,7 +171,7 @@ function draw(
|
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
const VERSION = "1.
|
|
174
|
+
const VERSION = "1.2.0"
|
|
175
175
|
|
|
176
176
|
function build(input: SplashWriterInput, kind: "entry" | "exit", ctx: ScrollbackRenderContext): ScrollbackSnapshot {
|
|
177
177
|
const width = Math.max(1, ctx.width)
|
package/src/cli/ui.ts
CHANGED
|
@@ -54,7 +54,7 @@ export function logo(pad?: string) {
|
|
|
54
54
|
result.push(row)
|
|
55
55
|
result.push(EOL)
|
|
56
56
|
}
|
|
57
|
-
result.push("AI-Powered Reverse Engineering & Pentest Platform v1.
|
|
57
|
+
result.push("AI-Powered Reverse Engineering & Pentest Platform v1.2.0")
|
|
58
58
|
return result.join("")
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -103,7 +103,7 @@ export function logo(pad?: string) {
|
|
|
103
103
|
result.push(EOL)
|
|
104
104
|
})
|
|
105
105
|
result.push(Style.TEXT_NORMAL, "─".repeat(45), EOL)
|
|
106
|
-
result.push(Style.TEXT_INFO, "▸", Style.TEXT_NORMAL, " AI-Powered Reverse Engineering & Pentest Platform ", Style.TEXT_DIM, "v1.
|
|
106
|
+
result.push(Style.TEXT_INFO, "▸", Style.TEXT_NORMAL, " AI-Powered Reverse Engineering & Pentest Platform ", Style.TEXT_DIM, "v1.2.0", EOL)
|
|
107
107
|
result.push(Style.TEXT_NORMAL, "─".repeat(45))
|
|
108
108
|
return result.join("").trimEnd()
|
|
109
109
|
}
|
|
@@ -17,6 +17,7 @@ export class Service extends ConfigService.Service<Service>()("@anymous/RuntimeF
|
|
|
17
17
|
autoShare: bool("ANYMOUS_AUTO_SHARE"),
|
|
18
18
|
pure: bool("ANYMOUS_PURE"),
|
|
19
19
|
disableDefaultPlugins: bool("ANYMOUS_DISABLE_DEFAULT_PLUGINS"),
|
|
20
|
+
fastBoot: bool("ANYMOUS_FAST_BOOT"),
|
|
20
21
|
disableEmbeddedWebUi: bool("ANYMOUS_DISABLE_EMBEDDED_WEB_UI"),
|
|
21
22
|
disableExternalSkills: bool("ANYMOUS_DISABLE_EXTERNAL_SKILLS"),
|
|
22
23
|
disableLspDownload: bool("ANYMOUS_DISABLE_LSP_DOWNLOAD"),
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { LayerNode } from "@anymous-ai/core/effect/layer-node"
|
|
2
|
+
import { Effect, Layer, Context, Schema, ParseResult } from "effect"
|
|
3
|
+
import { FSUtil } from "@anymous-ai/core/fs-util"
|
|
4
|
+
import { Global } from "@anymous-ai/core/global"
|
|
5
|
+
import path from "path"
|
|
6
|
+
|
|
7
|
+
const MemoryEntry = Schema.Struct({
|
|
8
|
+
key: Schema.String,
|
|
9
|
+
value: Schema.String,
|
|
10
|
+
timestamp: Schema.Number,
|
|
11
|
+
sessionID: Schema.optional(Schema.String),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const MemoryStore = Schema.Struct({
|
|
15
|
+
version: Schema.Literal(1),
|
|
16
|
+
memories: Schema.Array(MemoryEntry),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
interface MemoryEntryType extends Schema.Schema.Type<typeof MemoryEntry> {}
|
|
20
|
+
interface MemoryStoreType extends Schema.Schema.Type<typeof MemoryStore> {}
|
|
21
|
+
|
|
22
|
+
export interface Interface {
|
|
23
|
+
readonly read: (key: string) => Effect.Effect<MemoryEntryType | undefined>
|
|
24
|
+
readonly write: (key: string, value: string, sessionID?: string) => Effect.Effect<void>
|
|
25
|
+
readonly list: () => Effect.Effect<MemoryEntryType[]>
|
|
26
|
+
readonly delete: (key: string) => Effect.Effect<boolean>
|
|
27
|
+
readonly allText: () => Effect.Effect<string | undefined>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class Service extends Context.Service<Service, Interface>()("@anymous/Memory") {}
|
|
31
|
+
|
|
32
|
+
const memoryFilePath = (global: { config: string }) => path.join(global.config, "memory.json")
|
|
33
|
+
|
|
34
|
+
const loadStore = (fs: FSUtil.Interface, filePath: string) =>
|
|
35
|
+
Effect.gen(function* () {
|
|
36
|
+
const exists = yield* fs.exists(filePath)
|
|
37
|
+
if (!exists) {
|
|
38
|
+
return { version: 1, memories: [] } as MemoryStoreType
|
|
39
|
+
}
|
|
40
|
+
const raw = yield* fs.readFileString(filePath)
|
|
41
|
+
const parsed = JSON.parse(raw) as unknown
|
|
42
|
+
const decoded = yield* Schema.decodeUnknown(MemoryStore)(parsed).pipe(
|
|
43
|
+
Effect.catchAll(() => Effect.succeed({ version: 1, memories: [] } as MemoryStoreType)),
|
|
44
|
+
)
|
|
45
|
+
return decoded
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
const saveStore = (fs: FSUtil.Interface, filePath: string, store: MemoryStoreType) =>
|
|
49
|
+
Effect.gen(function* () {
|
|
50
|
+
yield* fs.writeFileString(filePath, JSON.stringify(store, null, 2))
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
const layer = Layer.effect(
|
|
54
|
+
Service,
|
|
55
|
+
Effect.gen(function* () {
|
|
56
|
+
const fs = yield* FSUtil.Service
|
|
57
|
+
const global = yield* Global.Service
|
|
58
|
+
const filePath = memoryFilePath(global)
|
|
59
|
+
|
|
60
|
+
const read: Interface["read"] = Effect.fn("Memory.read")(function* (key: string) {
|
|
61
|
+
const store = yield* loadStore(fs, filePath)
|
|
62
|
+
return store.memories.find((m) => m.key === key)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const write: Interface["write"] = Effect.fn("Memory.write")(function* (key: string, value: string, sessionID?: string) {
|
|
66
|
+
const store = yield* loadStore(fs, filePath)
|
|
67
|
+
const existing = store.memories.findIndex((m) => m.key === key)
|
|
68
|
+
const entry: MemoryEntryType = { key, value, timestamp: Date.now(), ...(sessionID ? { sessionID } : {}) }
|
|
69
|
+
if (existing >= 0) {
|
|
70
|
+
store.memories[existing] = entry
|
|
71
|
+
} else {
|
|
72
|
+
store.memories.push(entry)
|
|
73
|
+
}
|
|
74
|
+
yield* saveStore(fs, filePath, store)
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
const list: Interface["list"] = Effect.fn("Memory.list")(function* () {
|
|
78
|
+
const store = yield* loadStore(fs, filePath)
|
|
79
|
+
return store.memories
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const remove: Interface["delete"] = Effect.fn("Memory.delete")(function* (key: string) {
|
|
83
|
+
const store = yield* loadStore(fs, filePath)
|
|
84
|
+
const idx = store.memories.findIndex((m) => m.key === key)
|
|
85
|
+
if (idx < 0) return false
|
|
86
|
+
store.memories.splice(idx, 1)
|
|
87
|
+
yield* saveStore(fs, filePath, store)
|
|
88
|
+
return true
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
const allText: Interface["allText"] = Effect.fn("Memory.allText")(function* () {
|
|
92
|
+
const store = yield* loadStore(fs, filePath)
|
|
93
|
+
if (store.memories.length === 0) return undefined
|
|
94
|
+
const lines = store.memories.map((m) => `- ${m.key}: ${m.value}`)
|
|
95
|
+
return `## Shared Context / Memory\n\n${lines.join("\n")}`
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
return Service.of({ read, write, list, delete: remove, allText })
|
|
99
|
+
}),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
export const node = LayerNode.make({
|
|
103
|
+
service: Service,
|
|
104
|
+
layer: layer.pipe(Layer.orDie),
|
|
105
|
+
deps: [FSUtil.node, Global.node],
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
export * as Memory from "./memory"
|