@@ -1506,6 +1506,16 @@ describe("telemetry.classifyError", () => {
15061506 expect ( Telemetry . classifyError ( "Socket hang up" ) ) . toBe ( "connection" )
15071507 expect ( Telemetry . classifyError ( "ENOTFOUND db.example.com" ) ) . toBe ( "connection" )
15081508 expect ( Telemetry . classifyError ( "ECONNRESET" ) ) . toBe ( "connection" )
1509+ // altimate_change start — expanded connection patterns
1510+ expect ( Telemetry . classifyError ( "SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string" ) ) . toBe ( "connection" )
1511+ expect ( Telemetry . classifyError ( "password must be a string" ) ) . toBe ( "connection" )
1512+ expect ( Telemetry . classifyError ( "PostgreSQL driver not installed. Run: npm install pg" ) ) . toBe ( "connection" )
1513+ expect ( Telemetry . classifyError ( "Error: Connection mydb not found. Available: (none)" ) ) . toBe ( "connection" )
1514+ expect ( Telemetry . classifyError ( "No warehouse configured. Use warehouse.add" ) ) . toBe ( "connection" )
1515+ expect ( Telemetry . classifyError ( "Unsupported database type: clickhouse" ) ) . toBe ( "connection" )
1516+ expect ( Telemetry . classifyError ( "Connection reset by peer" ) ) . toBe ( "connection" )
1517+ expect ( Telemetry . classifyError ( "Connection closed unexpectedly" ) ) . toBe ( "connection" )
1518+ // altimate_change end
15091519 } )
15101520
15111521 test ( "classifies timeout errors" , ( ) => {
@@ -1520,20 +1530,47 @@ describe("telemetry.classifyError", () => {
15201530 expect ( Telemetry . classifyError ( "Invalid dialect specified" ) ) . toBe ( "validation" )
15211531 expect ( Telemetry . classifyError ( "Missing required field" ) ) . toBe ( "validation" )
15221532 expect ( Telemetry . classifyError ( "Required parameter 'query' not provided" ) ) . toBe ( "validation" )
1533+ // altimate_change start — expanded validation patterns
1534+ expect ( Telemetry . classifyError ( "You must read file /path/to/file before overwriting it" ) ) . toBe ( "validation" )
1535+ expect ( Telemetry . classifyError ( "File has been modified since it was last read" ) ) . toBe ( "validation" )
1536+ expect ( Telemetry . classifyError ( "error: column foo does not exist" ) ) . toBe ( "validation" )
1537+ expect ( Telemetry . classifyError ( "You must read file before overwriting it. Use the Read tool first" ) ) . toBe ( "validation" )
1538+ // altimate_change end
15231539 } )
15241540
15251541 test ( "classifies permission errors" , ( ) => {
15261542 expect ( Telemetry . classifyError ( "Permission denied on table" ) ) . toBe ( "permission" )
15271543 expect ( Telemetry . classifyError ( "Access denied for user" ) ) . toBe ( "permission" )
15281544 expect ( Telemetry . classifyError ( "Unauthorized access to resource" ) ) . toBe ( "permission" )
15291545 expect ( Telemetry . classifyError ( "403 Forbidden" ) ) . toBe ( "permission" )
1546+ // altimate_change start — authentication classified as permission
1547+ expect ( Telemetry . classifyError ( "Authentication failed for user admin" ) ) . toBe ( "permission" )
1548+ // altimate_change end
15301549 } )
15311550
15321551 test ( "classifies internal errors" , ( ) => {
15331552 expect ( Telemetry . classifyError ( "Internal server error" ) ) . toBe ( "internal" )
15341553 expect ( Telemetry . classifyError ( "Assertion failed: x > 0" ) ) . toBe ( "internal" )
15351554 } )
15361555
1556+ // altimate_change start — http_error class and priority ordering tests
1557+ test ( "classifies http errors" , ( ) => {
1558+ expect ( Telemetry . classifyError ( "Request failed with status code: 404 (example.com)" ) ) . toBe ( "http_error" )
1559+ expect ( Telemetry . classifyError ( "Request failed with status code: 500" ) ) . toBe ( "http_error" )
1560+ expect ( Telemetry . classifyError ( "status code: 403" ) ) . toBe ( "http_error" )
1561+ expect ( Telemetry . classifyError ( "Request failed with status" ) ) . toBe ( "http_error" )
1562+ } )
1563+
1564+ test ( "priority ordering: earlier patterns win over later ones" , ( ) => {
1565+ // SASL is connection, even though "authentication" is in permission
1566+ expect ( Telemetry . classifyError ( "SASL authentication failed" ) ) . toBe ( "connection" )
1567+ // parse_error wins over validation for "invalid syntax"
1568+ expect ( Telemetry . classifyError ( "parse error: invalid syntax" ) ) . toBe ( "parse_error" )
1569+ // permission ("forbidden") wins over http_error ("status code: 4")
1570+ expect ( Telemetry . classifyError ( "403 Forbidden, status code: 403" ) ) . toBe ( "permission" )
1571+ } )
1572+ // altimate_change end
1573+
15371574 test ( "returns unknown for unrecognized errors" , ( ) => {
15381575 expect ( Telemetry . classifyError ( "Something went wrong" ) ) . toBe ( "unknown" )
15391576 expect ( Telemetry . classifyError ( "" ) ) . toBe ( "unknown" )
@@ -1602,11 +1639,11 @@ describe("telemetry.computeInputSignature", () => {
16021639 expect ( sig ) . not . toContain ( "sk-abc123" )
16031640 expect ( sig ) . not . toContain ( "SELECT" )
16041641 expect ( sig ) . not . toContain ( "admin@example.com" )
1605- // Only type descriptors appear as values
1642+ // Only type descriptors appear as values; sensitive keys are fully redacted
16061643 const parsed = JSON . parse ( sig )
16071644 expect ( parsed . sql ) . toBe ( "string:60" )
1608- expect ( parsed . secret ) . toBe ( "string:16 " )
1609- expect ( parsed . api_key ) . toBe ( "string:9 " )
1645+ expect ( parsed . secret ) . toBe ( "**** " )
1646+ expect ( parsed . api_key ) . toBe ( "**** " )
16101647 } )
16111648
16121649 test ( "truncates output at 1000 chars with valid JSON" , ( ) => {
0 commit comments