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 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>;
@@ -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";
@@ -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
  };
@@ -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,3 @@
1
+ export declare const RTK_BINARY_NAME = "rtk";
2
+ export declare const DEFAULT_TIMEOUT_MS = 5000;
3
+ export declare const RTK_REWRITE_COMMAND = "rewrite";
@@ -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";
@@ -0,0 +1,11 @@
1
+ export interface RtkRewriteResult {
2
+ success: boolean;
3
+ rewrittenCommand?: string;
4
+ exitCode: number;
5
+ error?: string;
6
+ }
7
+ export interface RtkBinaryStatus {
8
+ available: boolean;
9
+ path: string | null;
10
+ checkedAt: number;
11
+ }
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 DEFAULT_TIMEOUT_MS = 120000;
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 ?? DEFAULT_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 DEFAULT_TIMEOUT_MS2 = 300000;
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 = DEFAULT_TIMEOUT_MS2;
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 DEFAULT_TIMEOUT_MS3 = 300000;
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 DEFAULT_TIMEOUT_MS4 = 60000;
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 ?? DEFAULT_TIMEOUT_MS4, DEFAULT_TIMEOUT_MS4);
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 ?? DEFAULT_TIMEOUT_MS3, DEFAULT_TIMEOUT_MS3);
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 DEFAULT_TIMEOUT_MS5 = 60000;
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 ${DEFAULT_TIMEOUT_MS5}ms`);
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
- }, DEFAULT_TIMEOUT_MS5);
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.0",
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",