opencode-matrixx 2.3.0 → 2.4.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/README.md +76 -0
- package/dist/config/schema/hooks.d.ts +1 -0
- package/dist/config/schema/matrixx-config.d.ts +6 -0
- package/dist/config/schema/rtk.d.ts +7 -0
- package/dist/config/schema.d.ts +1 -0
- package/dist/create-hooks.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/rtk-bash-rewriter/constants.d.ts +3 -0
- package/dist/hooks/rtk-bash-rewriter/hook.d.ts +12 -0
- package/dist/hooks/rtk-bash-rewriter/hook.test.d.ts +1 -0
- package/dist/hooks/rtk-bash-rewriter/index.d.ts +1 -0
- package/dist/hooks/rtk-bash-rewriter/types.d.ts +11 -0
- package/dist/index.js +73 -13
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -401,6 +401,82 @@ Sentinel never modifies code — it reports findings with CWE IDs, exact locatio
|
|
|
401
401
|
|
|
402
402
|
---
|
|
403
403
|
|
|
404
|
+
## RTK Integration — Token Compression
|
|
405
|
+
|
|
406
|
+
Matrixx integrates [RTK](https://github.com/rtk-ai/rtk) for automatic bash command compression, reducing LLM token consumption by **60-90%** on tool outputs.
|
|
407
|
+
|
|
408
|
+
### What is RTK?
|
|
409
|
+
|
|
410
|
+
RTK is a Rust CLI binary that intelligently rewrites bash commands to compress their output before it reaches the LLM. It recognizes 70+ command patterns (git, npm, cargo, test runners, linters, build tools) and applies smart filtering, grouping, and deduplication strategies.
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
# Without RTK: 2000 tokens
|
|
414
|
+
$ git status
|
|
415
|
+
On branch main
|
|
416
|
+
Changes not staged for commit:
|
|
417
|
+
modified: src/config.ts
|
|
418
|
+
modified: src/hooks/index.ts
|
|
419
|
+
... (50 more lines)
|
|
420
|
+
|
|
421
|
+
# With RTK: 200 tokens
|
|
422
|
+
$ rtk git status
|
|
423
|
+
2 files changed: src/config.ts, src/hooks/index.ts
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### How It Works
|
|
427
|
+
|
|
428
|
+
The RTK hook intercepts bash commands **before execution** and rewrites them to use RTK's compression:
|
|
429
|
+
|
|
430
|
+
1. LLM requests: `git status`
|
|
431
|
+
2. RTK hook rewrites to: `rtk git status`
|
|
432
|
+
3. RTK binary executes and compresses output
|
|
433
|
+
4. Compressed output (60-90% smaller) reaches the LLM
|
|
434
|
+
|
|
435
|
+
The hook runs **silently** — no configuration needed beyond enabling it. RTK's pattern matching handles the rest.
|
|
436
|
+
|
|
437
|
+
### Configuration
|
|
438
|
+
|
|
439
|
+
RTK is **disabled by default** (opt-in). Enable it in `matrixx.jsonc`:
|
|
440
|
+
|
|
441
|
+
```jsonc
|
|
442
|
+
{
|
|
443
|
+
"rtk": {
|
|
444
|
+
"enabled": true,
|
|
445
|
+
"binary_path": "/usr/local/bin/rtk", // optional — defaults to "rtk" in PATH
|
|
446
|
+
"timeout_ms": 5000 // optional — subprocess timeout
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Installation
|
|
452
|
+
|
|
453
|
+
Install RTK from [rtk-ai/rtk](https://github.com/rtk-ai/rtk):
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
# macOS
|
|
457
|
+
brew install rtk-ai/tap/rtk
|
|
458
|
+
|
|
459
|
+
# Linux (curl)
|
|
460
|
+
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/main/install.sh | bash
|
|
461
|
+
|
|
462
|
+
# Verify installation
|
|
463
|
+
rtk --version
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Performance Impact
|
|
467
|
+
|
|
468
|
+
| Metric | Value |
|
|
469
|
+
|--------|-------|
|
|
470
|
+
| **Overhead** | ~10-20ms per bash command |
|
|
471
|
+
| **Token savings** | 60-90% reduction on compressed commands |
|
|
472
|
+
| **Net benefit** | Significant for projects with frequent bash commands |
|
|
473
|
+
|
|
474
|
+
The 10-20ms subprocess overhead is negligible compared to command execution time and LLM context savings.
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
|
|
404
480
|
## Documentation
|
|
405
481
|
|
|
406
482
|
| | |
|
|
@@ -56,5 +56,6 @@ export declare const HookNameSchema: z.ZodEnum<{
|
|
|
56
56
|
"tool-pair-validator": "tool-pair-validator";
|
|
57
57
|
"task-notepad": "task-notepad";
|
|
58
58
|
"design-intent-preserver": "design-intent-preserver";
|
|
59
|
+
"rtk-bash-rewriter": "rtk-bash-rewriter";
|
|
59
60
|
}>;
|
|
60
61
|
export type HookName = z.infer<typeof HookNameSchema>;
|
|
@@ -124,6 +124,7 @@ export declare const MatrixxConfigSchema: z.ZodObject<{
|
|
|
124
124
|
"tool-pair-validator": "tool-pair-validator";
|
|
125
125
|
"task-notepad": "task-notepad";
|
|
126
126
|
"design-intent-preserver": "design-intent-preserver";
|
|
127
|
+
"rtk-bash-rewriter": "rtk-bash-rewriter";
|
|
127
128
|
}>>>;
|
|
128
129
|
disabled_commands: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
129
130
|
"bdd-contract": "bdd-contract";
|
|
@@ -1824,6 +1825,11 @@ export declare const MatrixxConfigSchema: z.ZodObject<{
|
|
|
1824
1825
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
1825
1826
|
proactive: z.ZodDefault<z.ZodBoolean>;
|
|
1826
1827
|
}, z.core.$strip>>;
|
|
1828
|
+
rtk: z.ZodOptional<z.ZodObject<{
|
|
1829
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
1830
|
+
binary_path: z.ZodOptional<z.ZodString>;
|
|
1831
|
+
timeout_ms: z.ZodDefault<z.ZodNumber>;
|
|
1832
|
+
}, z.core.$strip>>;
|
|
1827
1833
|
_migrations: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1828
1834
|
}, z.core.$strip>;
|
|
1829
1835
|
export type MatrixxConfig = z.infer<typeof MatrixxConfigSchema>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const RtkConfigSchema: z.ZodObject<{
|
|
3
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
4
|
+
binary_path: z.ZodOptional<z.ZodString>;
|
|
5
|
+
timeout_ms: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export type RtkConfig = z.infer<typeof RtkConfigSchema>;
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export * from "./schema/model-capabilities";
|
|
|
20
20
|
export * from "./schema/morpheus";
|
|
21
21
|
export * from "./schema/morpheus-agent";
|
|
22
22
|
export * from "./schema/notification";
|
|
23
|
+
export * from "./schema/rtk";
|
|
23
24
|
export * from "./schema/runtime-fallback";
|
|
24
25
|
export * from "./schema/security";
|
|
25
26
|
export * from "./schema/skills";
|
package/dist/create-hooks.d.ts
CHANGED
|
@@ -68,4 +68,5 @@ export declare function createHooks(args: {
|
|
|
68
68
|
taskResumeInfo: ReturnType<typeof import("./hooks").createTaskResumeInfoHook>;
|
|
69
69
|
anthropicEffort: ReturnType<typeof import("./hooks/anthropic-effort").createAnthropicEffortHook> | null;
|
|
70
70
|
runtimeFallback: ReturnType<typeof import("./hooks").createRuntimeFallbackHook> | null;
|
|
71
|
+
rtkBashRewriter: ReturnType<typeof import("./hooks").createRtkBashRewriterHook> | null;
|
|
71
72
|
};
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export { createOracleMdOnlyHook } from "./prometheus-md-only";
|
|
|
32
32
|
export { createQualityGateHook } from "./quality-gate/hook";
|
|
33
33
|
export { createQuestionLabelTruncatorHook } from "./question-label-truncator";
|
|
34
34
|
export { createReadImageResizerHook } from "./read-image-resizer";
|
|
35
|
+
export { createRtkBashRewriterHook } from "./rtk-bash-rewriter";
|
|
35
36
|
export { createRulesInjectorHook } from "./rules-injector";
|
|
36
37
|
export { createRuntimeFallbackHook, type RuntimeFallbackHook, type RuntimeFallbackOptions, SessionCategoryRegistry } from "./runtime-fallback";
|
|
37
38
|
export { createSecretLeakGuardHook } from "./secret-leak-guard";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
|
+
import type { MatrixxConfig } from "../../config";
|
|
3
|
+
export declare function createRtkBashRewriterHook(_ctx: PluginInput, config: MatrixxConfig): {
|
|
4
|
+
"tool.execute.before": (input: {
|
|
5
|
+
tool: string;
|
|
6
|
+
sessionID: string;
|
|
7
|
+
callID: string;
|
|
8
|
+
}, output: {
|
|
9
|
+
args: Record<string, unknown>;
|
|
10
|
+
message?: string;
|
|
11
|
+
}) => Promise<void>;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createRtkBashRewriterHook } from "./hook";
|
package/dist/index.js
CHANGED
|
@@ -67770,6 +67770,53 @@ function createReadImageResizerHook(_ctx) {
|
|
|
67770
67770
|
}
|
|
67771
67771
|
};
|
|
67772
67772
|
}
|
|
67773
|
+
// src/hooks/rtk-bash-rewriter/constants.ts
|
|
67774
|
+
var RTK_BINARY_NAME = "rtk";
|
|
67775
|
+
var DEFAULT_TIMEOUT_MS = 5000;
|
|
67776
|
+
var RTK_REWRITE_COMMAND = "rewrite";
|
|
67777
|
+
|
|
67778
|
+
// src/hooks/rtk-bash-rewriter/hook.ts
|
|
67779
|
+
function createRtkBashRewriterHook(_ctx, config2) {
|
|
67780
|
+
const rtkConfig = config2.rtk;
|
|
67781
|
+
const _timeoutMs = rtkConfig?.timeout_ms ?? DEFAULT_TIMEOUT_MS;
|
|
67782
|
+
const binaryPath = rtkConfig?.binary_path ?? RTK_BINARY_NAME;
|
|
67783
|
+
const hasRtk = Bun.which(binaryPath) !== null;
|
|
67784
|
+
if (!hasRtk) {
|
|
67785
|
+
log(`[rtk-bash-rewriter] rtk binary not found at '${binaryPath}'. Hook will pass through all commands.`);
|
|
67786
|
+
}
|
|
67787
|
+
return {
|
|
67788
|
+
"tool.execute.before": async (input, output) => {
|
|
67789
|
+
if (input.tool.toLowerCase() !== "bash") {
|
|
67790
|
+
return;
|
|
67791
|
+
}
|
|
67792
|
+
if (!hasRtk) {
|
|
67793
|
+
return;
|
|
67794
|
+
}
|
|
67795
|
+
const command = output.args.command;
|
|
67796
|
+
if (!command) {
|
|
67797
|
+
return;
|
|
67798
|
+
}
|
|
67799
|
+
try {
|
|
67800
|
+
const proc = Bun.spawn([binaryPath, RTK_REWRITE_COMMAND, command], {
|
|
67801
|
+
stdout: "pipe",
|
|
67802
|
+
stderr: "pipe"
|
|
67803
|
+
});
|
|
67804
|
+
const exitCode = await proc.exited;
|
|
67805
|
+
if (exitCode !== 0 && exitCode !== 3) {
|
|
67806
|
+
return;
|
|
67807
|
+
}
|
|
67808
|
+
const rewritten = await new Response(proc.stdout).text();
|
|
67809
|
+
const trimmed = rewritten.trim();
|
|
67810
|
+
if (trimmed && trimmed !== command) {
|
|
67811
|
+
output.args.command = trimmed;
|
|
67812
|
+
log(`[rtk-bash-rewriter] Rewrote command: '${command}' \u2192 '${trimmed}'`);
|
|
67813
|
+
}
|
|
67814
|
+
} catch (error51) {
|
|
67815
|
+
log(`[rtk-bash-rewriter] Rewrite failed: ${error51}`);
|
|
67816
|
+
}
|
|
67817
|
+
}
|
|
67818
|
+
};
|
|
67819
|
+
}
|
|
67773
67820
|
// src/hooks/rules-injector/project-root-finder.ts
|
|
67774
67821
|
import { existsSync as existsSync38, statSync as statSync4 } from "fs";
|
|
67775
67822
|
import { dirname as dirname13, join as join50 } from "path";
|
|
@@ -72374,7 +72421,7 @@ This is a reminder only. No automatic action was taken.`;
|
|
|
72374
72421
|
// src/hooks/unstable-agent-babysitter/unstable-agent-babysitter-hook.ts
|
|
72375
72422
|
init_logger();
|
|
72376
72423
|
var HOOK_NAME15 = "unstable-agent-babysitter";
|
|
72377
|
-
var
|
|
72424
|
+
var DEFAULT_TIMEOUT_MS2 = 120000;
|
|
72378
72425
|
var COOLDOWN_MS = 5 * 60 * 1000;
|
|
72379
72426
|
async function resolveMainSessionTarget(ctx, sessionID) {
|
|
72380
72427
|
let agent = getSessionAgent(sessionID);
|
|
@@ -72445,7 +72492,7 @@ function createUnstableAgentBabysitterHook(ctx, options) {
|
|
|
72445
72492
|
const tasks = options.backgroundManager.getTasksByParentSession(mainSessionID);
|
|
72446
72493
|
if (tasks.length === 0)
|
|
72447
72494
|
return;
|
|
72448
|
-
const timeoutMs = options.config?.timeout_ms ??
|
|
72495
|
+
const timeoutMs = options.config?.timeout_ms ?? DEFAULT_TIMEOUT_MS2;
|
|
72449
72496
|
const now = Date.now();
|
|
72450
72497
|
for (const task of tasks) {
|
|
72451
72498
|
if (task.status !== "running")
|
|
@@ -86836,7 +86883,7 @@ var CLI_LANGUAGES = [
|
|
|
86836
86883
|
"tsx",
|
|
86837
86884
|
"yaml"
|
|
86838
86885
|
];
|
|
86839
|
-
var
|
|
86886
|
+
var DEFAULT_TIMEOUT_MS3 = 300000;
|
|
86840
86887
|
var DEFAULT_MAX_OUTPUT_BYTES = 1 * 1024 * 1024;
|
|
86841
86888
|
var DEFAULT_MAX_MATCHES = 500;
|
|
86842
86889
|
|
|
@@ -87131,7 +87178,7 @@ async function runSg(options) {
|
|
|
87131
87178
|
};
|
|
87132
87179
|
}
|
|
87133
87180
|
}
|
|
87134
|
-
const timeout =
|
|
87181
|
+
const timeout = DEFAULT_TIMEOUT_MS3;
|
|
87135
87182
|
const proc = spawn9([cliPath, ...args], {
|
|
87136
87183
|
stdout: "pipe",
|
|
87137
87184
|
stderr: "pipe"
|
|
@@ -89582,7 +89629,7 @@ var DEFAULT_MAX_DEPTH = 20;
|
|
|
89582
89629
|
var DEFAULT_MAX_FILESIZE = "10M";
|
|
89583
89630
|
var DEFAULT_MAX_COUNT = 500;
|
|
89584
89631
|
var DEFAULT_MAX_COLUMNS = 1000;
|
|
89585
|
-
var
|
|
89632
|
+
var DEFAULT_TIMEOUT_MS4 = 300000;
|
|
89586
89633
|
var DEFAULT_MAX_OUTPUT_BYTES2 = 10 * 1024 * 1024;
|
|
89587
89634
|
var RG_SAFETY_FLAGS = [
|
|
89588
89635
|
"--no-follow",
|
|
@@ -89594,7 +89641,7 @@ var RG_SAFETY_FLAGS = [
|
|
|
89594
89641
|
var GREP_SAFETY_FLAGS = ["-n", "-H", "--color=never"];
|
|
89595
89642
|
|
|
89596
89643
|
// src/tools/glob/constants.ts
|
|
89597
|
-
var
|
|
89644
|
+
var DEFAULT_TIMEOUT_MS5 = 60000;
|
|
89598
89645
|
var DEFAULT_LIMIT = 100;
|
|
89599
89646
|
var DEFAULT_MAX_DEPTH2 = 20;
|
|
89600
89647
|
var DEFAULT_MAX_OUTPUT_BYTES3 = 10 * 1024 * 1024;
|
|
@@ -89657,7 +89704,7 @@ async function getFileMtime(filePath) {
|
|
|
89657
89704
|
}
|
|
89658
89705
|
async function runRgFiles(options, resolvedCli) {
|
|
89659
89706
|
const cli = resolvedCli ?? resolveGrepCli();
|
|
89660
|
-
const timeout = Math.min(options.timeout ??
|
|
89707
|
+
const timeout = Math.min(options.timeout ?? DEFAULT_TIMEOUT_MS5, DEFAULT_TIMEOUT_MS5);
|
|
89661
89708
|
const limit = Math.min(options.limit ?? DEFAULT_LIMIT, DEFAULT_LIMIT);
|
|
89662
89709
|
const isRg = cli.backend === "rg";
|
|
89663
89710
|
const isWindows = process.platform === "win32";
|
|
@@ -89879,7 +89926,7 @@ function parseOutput(output) {
|
|
|
89879
89926
|
async function runRg(options) {
|
|
89880
89927
|
const cli = resolveGrepCli();
|
|
89881
89928
|
const args = buildArgs(options, cli.backend);
|
|
89882
|
-
const timeout = Math.min(options.timeout ??
|
|
89929
|
+
const timeout = Math.min(options.timeout ?? DEFAULT_TIMEOUT_MS4, DEFAULT_TIMEOUT_MS4);
|
|
89883
89930
|
if (cli.backend === "rg") {
|
|
89884
89931
|
args.push("--", options.pattern);
|
|
89885
89932
|
} else {
|
|
@@ -90354,7 +90401,7 @@ function createHandoffTools(ctx) {
|
|
|
90354
90401
|
init_logger();
|
|
90355
90402
|
|
|
90356
90403
|
// src/tools/interactive-bash/constants.ts
|
|
90357
|
-
var
|
|
90404
|
+
var DEFAULT_TIMEOUT_MS6 = 60000;
|
|
90358
90405
|
var BLOCKED_TMUX_SUBCOMMANDS = [
|
|
90359
90406
|
"capture-pane",
|
|
90360
90407
|
"capturep",
|
|
@@ -90451,7 +90498,7 @@ The Bash tool can execute these commands directly. Do NOT retry with interactive
|
|
|
90451
90498
|
});
|
|
90452
90499
|
const timeoutPromise = new Promise((_, reject) => {
|
|
90453
90500
|
const id = setTimeout(() => {
|
|
90454
|
-
const timeoutError = new Error(`Timeout after ${
|
|
90501
|
+
const timeoutError = new Error(`Timeout after ${DEFAULT_TIMEOUT_MS6}ms`);
|
|
90455
90502
|
try {
|
|
90456
90503
|
proc.kill();
|
|
90457
90504
|
proc.exited.catch((err) => {
|
|
@@ -90459,7 +90506,7 @@ The Bash tool can execute these commands directly. Do NOT retry with interactive
|
|
|
90459
90506
|
});
|
|
90460
90507
|
} catch {}
|
|
90461
90508
|
reject(timeoutError);
|
|
90462
|
-
},
|
|
90509
|
+
}, DEFAULT_TIMEOUT_MS6);
|
|
90463
90510
|
proc.exited.then(() => clearTimeout(id)).catch(() => clearTimeout(id));
|
|
90464
90511
|
});
|
|
90465
90512
|
const [stdout, stderr, exitCode] = await Promise.race([
|
|
@@ -97030,6 +97077,7 @@ function createSessionHooks(args) {
|
|
|
97030
97077
|
config: pluginConfig.runtime_fallback,
|
|
97031
97078
|
pluginConfig
|
|
97032
97079
|
})) : null;
|
|
97080
|
+
const rtkBashRewriter = isHookEnabled("rtk-bash-rewriter") && pluginConfig.rtk?.enabled ? safeHook("rtk-bash-rewriter", () => createRtkBashRewriterHook(ctx, pluginConfig)) : null;
|
|
97033
97081
|
return {
|
|
97034
97082
|
contextWindowMonitor,
|
|
97035
97083
|
preemptiveCompaction,
|
|
@@ -97050,7 +97098,8 @@ function createSessionHooks(args) {
|
|
|
97050
97098
|
questionLabelTruncator,
|
|
97051
97099
|
taskResumeInfo,
|
|
97052
97100
|
anthropicEffort,
|
|
97053
|
-
runtimeFallback
|
|
97101
|
+
runtimeFallback,
|
|
97102
|
+
rtkBashRewriter
|
|
97054
97103
|
};
|
|
97055
97104
|
}
|
|
97056
97105
|
|
|
@@ -112899,7 +112948,8 @@ var HookNameSchema = exports_external.enum([
|
|
|
112899
112948
|
"tool-pair-validator",
|
|
112900
112949
|
"quality-gate",
|
|
112901
112950
|
"task-notepad",
|
|
112902
|
-
"design-intent-preserver"
|
|
112951
|
+
"design-intent-preserver",
|
|
112952
|
+
"rtk-bash-rewriter"
|
|
112903
112953
|
]);
|
|
112904
112954
|
// src/config/schema/matrix-loop.ts
|
|
112905
112955
|
var MatrixLoopConfigSchema = exports_external.object({
|
|
@@ -112944,6 +112994,13 @@ var NotificationConfigSchema = exports_external.object({
|
|
|
112944
112994
|
force_enable: exports_external.boolean().optional()
|
|
112945
112995
|
});
|
|
112946
112996
|
|
|
112997
|
+
// src/config/schema/rtk.ts
|
|
112998
|
+
var RtkConfigSchema = exports_external.object({
|
|
112999
|
+
enabled: exports_external.boolean().default(false),
|
|
113000
|
+
binary_path: exports_external.string().optional(),
|
|
113001
|
+
timeout_ms: exports_external.number().int().min(1000).max(30000).default(5000)
|
|
113002
|
+
});
|
|
113003
|
+
|
|
112947
113004
|
// src/config/schema/runtime-fallback.ts
|
|
112948
113005
|
var RuntimeFallbackConfigSchema = exports_external.object({
|
|
112949
113006
|
enabled: exports_external.boolean().optional().default(false),
|
|
@@ -113088,6 +113145,7 @@ var MatrixxConfigSchema = exports_external.object({
|
|
|
113088
113145
|
agent_definitions: AgentDefinitionsConfigSchema.optional(),
|
|
113089
113146
|
model_capabilities: ModelCapabilitiesConfigSchema.optional(),
|
|
113090
113147
|
matrixx_self_config: MatrixxSelfConfigSkillConfigSchema.optional(),
|
|
113148
|
+
rtk: RtkConfigSchema.optional(),
|
|
113091
113149
|
_migrations: exports_external.array(exports_external.string()).optional()
|
|
113092
113150
|
});
|
|
113093
113151
|
// src/plugin-config.ts
|
|
@@ -113713,6 +113771,7 @@ function createToolExecuteBeforeHandler2(args) {
|
|
|
113713
113771
|
const questionLabelTruncatorHook = hooks2.questionLabelTruncator?.["tool.execute.before"];
|
|
113714
113772
|
const mouseNotepadHook = hooks2.mouseNotepad?.["tool.execute.before"];
|
|
113715
113773
|
const architectHookHook = hooks2.architectHook?.["tool.execute.before"];
|
|
113774
|
+
const rtkBashRewriterHook = hooks2.rtkBashRewriter?.["tool.execute.before"];
|
|
113716
113775
|
return async (input, output) => {
|
|
113717
113776
|
await Promise.all([
|
|
113718
113777
|
qualityGateHook?.(input, output),
|
|
@@ -113740,6 +113799,7 @@ function createToolExecuteBeforeHandler2(args) {
|
|
|
113740
113799
|
resolvePromise = resolveSessionAgent(ctx.client, sessionId);
|
|
113741
113800
|
}
|
|
113742
113801
|
}
|
|
113802
|
+
await rtkBashRewriterHook?.(input, output);
|
|
113743
113803
|
await nonInteractiveEnvHook?.(input, output);
|
|
113744
113804
|
await bashFileReadGuardHook?.(input, output);
|
|
113745
113805
|
await questionLabelTruncatorHook?.(input, output);
|
|
@@ -51,4 +51,5 @@ export declare function createCoreHooks(args: {
|
|
|
51
51
|
taskResumeInfo: ReturnType<typeof import("../../hooks").createTaskResumeInfoHook>;
|
|
52
52
|
anthropicEffort: ReturnType<typeof import("../../hooks/anthropic-effort").createAnthropicEffortHook> | null;
|
|
53
53
|
runtimeFallback: ReturnType<typeof import("../../hooks").createRuntimeFallbackHook> | null;
|
|
54
|
+
rtkBashRewriter: ReturnType<typeof import("../../hooks").createRtkBashRewriterHook> | null;
|
|
54
55
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { HookName, MatrixxConfig } from "../../config";
|
|
2
|
-
import { createAgentUsageReminderHook, createAnthropicContextWindowLimitRecoveryHook, createAutoUpdateCheckerHook, createContextWindowMonitorHook, createDelegateTaskRetryHook, createEditErrorRecoveryHook, createInteractiveBashSessionHook, createMatrixLoopHook, createMouseNotepadHook, createNonInteractiveEnvHook, createOracleMdOnlyHook, createPreemptiveCompactionHook, createQuestionLabelTruncatorHook, createRuntimeFallbackHook, createSessionNotification, createSessionRecoveryHook, createStartWorkHook, createTaskResumeInfoHook, createThinkModeHook } from "../../hooks";
|
|
2
|
+
import { createAgentUsageReminderHook, createAnthropicContextWindowLimitRecoveryHook, createAutoUpdateCheckerHook, createContextWindowMonitorHook, createDelegateTaskRetryHook, createEditErrorRecoveryHook, createInteractiveBashSessionHook, createMatrixLoopHook, createMouseNotepadHook, createNonInteractiveEnvHook, createOracleMdOnlyHook, createPreemptiveCompactionHook, createQuestionLabelTruncatorHook, createRtkBashRewriterHook, createRuntimeFallbackHook, createSessionNotification, createSessionRecoveryHook, createStartWorkHook, createTaskResumeInfoHook, createThinkModeHook } from "../../hooks";
|
|
3
3
|
import { createAnthropicEffortHook } from "../../hooks/anthropic-effort";
|
|
4
4
|
import type { PluginContext } from "../types";
|
|
5
5
|
export type SessionHooks = {
|
|
@@ -23,6 +23,7 @@ export type SessionHooks = {
|
|
|
23
23
|
taskResumeInfo: ReturnType<typeof createTaskResumeInfoHook>;
|
|
24
24
|
anthropicEffort: ReturnType<typeof createAnthropicEffortHook> | null;
|
|
25
25
|
runtimeFallback: ReturnType<typeof createRuntimeFallbackHook> | null;
|
|
26
|
+
rtkBashRewriter: ReturnType<typeof createRtkBashRewriterHook> | null;
|
|
26
27
|
};
|
|
27
28
|
export declare function createSessionHooks(args: {
|
|
28
29
|
ctx: PluginContext;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-matrixx",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|