TavernKeeper Scan Report

ZDOSt/Story-Engine

Commit 3fc27a1 Reviewed

No material or immediate-danger concern was identified in this review.

This advisory report describes what the named tools and review process found at one exact commit. Unknown or unobserved behavior may still exist.

0 immediate danger 0 material 24 low

What this review found

No material or immediate-danger item was identified.

Minor cautions

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
semantic-extractor.js:348

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
character-sheet-validation.js:108

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
deterministic-runner.js:3731

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
index.js:3733

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
scene-item-state.js:443

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
narration-sanitizer.js:67

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
prose-guard-edits.js:294

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
pre-flight.js:1199

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A crafted input might briefly slow or freeze the local client, without showing broader security harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The expression may permit a local CPU slowdown, but this evidence shows no credential, persistence, code-execution, or cross-user impact.

Impact: low · Exploitability: plausible

Developer action: Bound the input length or replace the expression when practical.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
character-sheet-generation.js:183
Contextual expected matches (12)

JavaScript analysis reported javascript.xray.unsafe-regex

Expected behavior · high confidence

A static scanner flagged this regular expression as potentially unsafe, but the pattern is simple and only processes the project's own internal data. There is no realistic way for it to cause harm.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: The flagged regex at line 44 is a simple, bounded pattern that parses internal report-path strings of the form relationshipEngine[name].field.subfield. It contains no nested quantifiers or overlapping alternatives that could cause catastrophic backtracking. The input it matches comes from project-internal fixture definitions, not attacker-controlled data. No ReDoS or other security issue is demonstrated.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
semantic-golden-evaluator.mjs:44

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is part of a test file that pulls out individual functions from the extension's own code to test them separately. The dynamic execution only runs the project's own code with fixed test values, not anything from outside or from a user. This is a normal testing approach and poses no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call in a behavior test file. The test reads the project's own `index.js` source from the local filesystem, slices out a specific function body by string matching, and wraps it in `new Function` to execute that function in isolation for unit testing. The arguments passed are hardcoded test values (a modes object). No attacker-controlled input reaches this path; the evaluated code is the project's own committed source. This is a standard test-harness pattern for testing non-exported functions.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21038-21041

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is another test that extracts a function from the extension's own code to verify it works correctly. Only fixed test data and simple mock helpers are used. There is no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call that constructs `getLatestNarratorHandoffEntry` from the project's own `index.js` source text for isolated testing. The injected arguments are simple mock lambdas (message type checks and property accessors). No untrusted or attacker-controlled data flows into the dynamically constructed function. This is a test-only pattern with no runtime exposure in the shipped extension.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21059-21063

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This code dynamically creates a function from the project's own source code so a test can verify layout calculations. Because it only uses the project's own code and runs in a test file, it does not introduce a security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The new Function call at lines 11804-11813 constructs a function from source code extracted from the project's own index.js file (trackerLayoutSource). The embedded code is project-internal layout math logic, not attacker-controlled or user-supplied input. This is a test-harness technique to exercise specific bundled functions in isolation with fixed constant definitions. No untrusted data flows into the function constructor, and this file is a test file, not production runtime code loaded by the SillyTavern extension.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:11804-11813

Gitleaks reported generic-api-key

Expected behavior · high confidence

This is a test that checks whether the extension properly hides API keys and authorization tokens when displaying error messages. The 'secrets' detected by the scanner are fake test values designed to look like keys so the test can confirm they get removed from output. No real credentials are exposed.

Technical evidence

Scanner reason: Gitleaks matched secret-detection rule generic-api-key. The match applies to this repository.

Contextual assessment: The matched line is inside a test case in file that verifies the `formatSemanticDiagnostic` function properly redacts secrets from error messages. The strings that triggered gitleaks are synthetic test fixtures: `[REDACTED_SECRET:...]` placeholders that are already redacted, and `google-sensitive-key`, a deliberately named test string used to confirm that query-parameter keys are scrubbed from diagnostic output. The test explicitly asserts the formatted output does NOT contain these strings, proving the redaction works. No real credentials are present, and these values exist solely to test the redaction pipeline.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
gitleaks 8.30.1
Rule
generic-api-key
File role
production
Source
test-behavior.mjs:18097

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This test extracts a settings-migration function from the extension's own code and tests it with fixed values. No outside data is involved, so there is no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call that constructs `migrateNarratorHandoffSettings` from the project's own source for isolated unit testing. The arguments are hardcoded constants (numeric values, a sides map, and a simple coordinate lambda). No external or attacker-controlled input reaches this dynamic execution path. The evaluated body is the project's own committed function code.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21050-21058

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This dynamically creates a display-formatting function from the project's own code for testing. The only extra input is a simple built-in text-trimming helper. It does not introduce a security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The new Function call at lines 11821-11824 constructs formatTrackerItemDisplayName from source sliced from the project's own index.js (itemFormatterSource). The only injected parameter is a trivially safe inline arrow function that trims and slices a string. The function body is project-internal display formatting logic, not attacker-controlled code. This is a test-harness isolation technique with no untrusted data flow.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:11821-11824

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This test pulls out a dimension-normalization helper from the extension's own code and checks it with fixed numbers. There is no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call that constructs `normalizeTrackerWidgetSavedDimension` from the project's own source text. The function is invoked with no injected arguments and tested with hardcoded numeric values. No untrusted input flows into this path. This is a test-only isolation pattern.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21042-21047

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This test extracts a widget-layout function from the extension's own code and runs it with fixed test values and simple mock helpers. No outside data is involved, so there is no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call that constructs `getNarratorHandoffWidgetLayout` from the project's own source text. The injected arguments are all hardcoded constants and simple mock lambdas (dimension clamps, coordinate mappers, a mock globalThis with innerWidth). No attacker-controlled or untrusted input reaches this dynamic execution. This is a test-harness pattern for verifying widget layout logic in isolation.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21067-21082

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is test code that reads a function from the extension's source file and runs it in isolation with fake data to check that old settings are properly cleaned up. The dynamic execution is confined to the test suite, uses only mock data controlled by the test, and does not run when the extension is used normally.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The `new Function` call occurs in a test file (file) and is used to extract the `getSettings` function body from the production source file by string-slicing between two known function boundaries, then invoking it with fully controlled mock arguments to verify settings migration behavior. No untrusted or external input flows into the constructed function body or its arguments. This is a legitimate test-harness technique for testing functions that depend on module-level globals, and it executes only in the test suite, not in the shipped extension runtime.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:17594-17604

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This dynamically creates a function from the project's own migration code to test it in isolation. Since it only uses the project's own code and lives in a test file, it poses no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The new Function call at lines 11814-11820 constructs migrateTrackerWidgetSettings from source sliced out of the project's own index.js (trackerMigrationSource). The function body is project-internal migration logic, not external or user-supplied code. This is part of a test harness that validates widget-settings migration behavior. No untrusted input reaches the function constructor.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:11814-11820

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is part of a test file that extracts widget-sizing functions from the extension's own code to verify they calculate positions correctly. Only fixed test values and a simple fake document object are used. There is no security risk.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags a `new Function(...)` call in a behavior test file within the test case 'tracker widgets stay in their chat-side margins with anchored three-corner resizing'. The test reads the project's own `index.js` source, slices out tracker widget geometry functions by string boundary matching, and wraps them in `new Function` to test them in isolation. The injected arguments are all hardcoded numeric constants and a minimal mock document object with a single querySelector stub. No attacker-controlled or untrusted input reaches this dynamic execution path. The evaluated code is the project's own committed function bodies. This is a standard test-harness isolation pattern.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
test-behavior.mjs:21215-21230

Related contextual observations

Bounded regex on internal report-path strings

low risk · high confidence

The flagged pattern is a straightforward string-matching expression with no dangerous complexity, and it only sees data defined inside the project itself.

Technical assessment

The regex ^relationshipEngine\[([^\]]+)\](?:\.(.*))?$ uses a single character-class negation for the bracket content and a single .* for the optional suffix. Neither sub-pattern has nested or overlapping quantifiers, so there is no catastrophic backtracking vector. The matched string originates from fixture report-path definitions within the project, not from untrusted or user-supplied input.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

All five dynamic-execution candidates belong to the same test harness function

low risk · high confidence

All five flagged code sections are part of the same test that checks how the extension's display widgets work. Each one simply extracts a piece of the extension's own code and tests it with fixed values. None of them handle user input, network traffic, or sensitive data.

Technical assessment

All five candidates are within the same test case named 'narration handoff display is optional routed and independently persistent' in the behavior test file. Each `new Function` call follows the identical pattern: read `index.js` from disk, slice out a function body by string boundary matching, wrap it in `new Function` with named parameter injection, and invoke with hardcoded test values. No candidate involves network access, credential handling, user input, or persistence. The test file imports `node:fs` and `node:assert/strict` and runs as a standalone Node script, not as part of the browser-loaded extension.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Test harness uses new Function to isolate and test widget geometry functions

low risk · high confidence

This test checks that the extension's widget positioning math works correctly by pulling the relevant functions out of the extension's own code and testing them with fixed numbers. No outside data or sensitive information is involved.

Technical assessment

The test reads `index.js` from the local filesystem, extracts a block of tracker widget geometry functions by string slicing between two known function declarations, and wraps them in `new Function` with named parameters for constants and mock globals. The mock document provides only a single querySelector that returns a fixed bounding rect. All test assertions use hardcoded numeric inputs and expected outputs. No network, credential, persistence, or user-input data flow is present.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Coverage and limitations

JavaScript coverage

Unresolved JavaScript stages

Tools

Limitations

Technical scan identity