@@ -1538,6 +1538,16 @@ describe("telemetry.classifyError", () => {
15381538 expect ( Telemetry . classifyError ( "Socket hang up" ) ) . toBe ( "connection" )
15391539 expect ( Telemetry . classifyError ( "ENOTFOUND db.example.com" ) ) . toBe ( "connection" )
15401540 expect ( Telemetry . classifyError ( "ECONNRESET" ) ) . toBe ( "connection" )
1541+ // altimate_change start — expanded connection patterns
1542+ expect ( Telemetry . classifyError ( "SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string" ) ) . toBe ( "connection" )
1543+ expect ( Telemetry . classifyError ( "password must be a string" ) ) . toBe ( "connection" )
1544+ expect ( Telemetry . classifyError ( "PostgreSQL driver not installed. Run: npm install pg" ) ) . toBe ( "connection" )
1545+ expect ( Telemetry . classifyError ( "Error: Connection mydb not found. Available: (none)" ) ) . toBe ( "connection" )
1546+ expect ( Telemetry . classifyError ( "No warehouse configured. Use warehouse.add" ) ) . toBe ( "connection" )
1547+ expect ( Telemetry . classifyError ( "Unsupported database type: clickhouse" ) ) . toBe ( "connection" )
1548+ expect ( Telemetry . classifyError ( "Connection reset by peer" ) ) . toBe ( "connection" )
1549+ expect ( Telemetry . classifyError ( "Connection closed unexpectedly" ) ) . toBe ( "connection" )
1550+ // altimate_change end
15411551 } )
15421552
15431553 test ( "classifies timeout errors" , ( ) => {
@@ -1552,20 +1562,47 @@ describe("telemetry.classifyError", () => {
15521562 expect ( Telemetry . classifyError ( "Invalid dialect specified" ) ) . toBe ( "validation" )
15531563 expect ( Telemetry . classifyError ( "Missing required field" ) ) . toBe ( "validation" )
15541564 expect ( Telemetry . classifyError ( "Required parameter 'query' not provided" ) ) . toBe ( "validation" )
1565+ // altimate_change start — expanded validation patterns
1566+ expect ( Telemetry . classifyError ( "You must read file /path/to/file before overwriting it" ) ) . toBe ( "validation" )
1567+ expect ( Telemetry . classifyError ( "File has been modified since it was last read" ) ) . toBe ( "validation" )
1568+ expect ( Telemetry . classifyError ( "error: column foo does not exist" ) ) . toBe ( "validation" )
1569+ expect ( Telemetry . classifyError ( "You must read file before overwriting it. Use the Read tool first" ) ) . toBe ( "validation" )
1570+ // altimate_change end
15551571 } )
15561572
15571573 test ( "classifies permission errors" , ( ) => {
15581574 expect ( Telemetry . classifyError ( "Permission denied on table" ) ) . toBe ( "permission" )
15591575 expect ( Telemetry . classifyError ( "Access denied for user" ) ) . toBe ( "permission" )
15601576 expect ( Telemetry . classifyError ( "Unauthorized access to resource" ) ) . toBe ( "permission" )
15611577 expect ( Telemetry . classifyError ( "403 Forbidden" ) ) . toBe ( "permission" )
1578+ // altimate_change start — authentication classified as permission
1579+ expect ( Telemetry . classifyError ( "Authentication failed for user admin" ) ) . toBe ( "permission" )
1580+ // altimate_change end
15621581 } )
15631582
15641583 test ( "classifies internal errors" , ( ) => {
15651584 expect ( Telemetry . classifyError ( "Internal server error" ) ) . toBe ( "internal" )
15661585 expect ( Telemetry . classifyError ( "Assertion failed: x > 0" ) ) . toBe ( "internal" )
15671586 } )
15681587
1588+ // altimate_change start — http_error class and priority ordering tests
1589+ test ( "classifies http errors" , ( ) => {
1590+ expect ( Telemetry . classifyError ( "Request failed with status code: 404 (example.com)" ) ) . toBe ( "http_error" )
1591+ expect ( Telemetry . classifyError ( "Request failed with status code: 500" ) ) . toBe ( "http_error" )
1592+ expect ( Telemetry . classifyError ( "status code: 403" ) ) . toBe ( "http_error" )
1593+ expect ( Telemetry . classifyError ( "Request failed with status" ) ) . toBe ( "http_error" )
1594+ } )
1595+
1596+ test ( "priority ordering: earlier patterns win over later ones" , ( ) => {
1597+ // SASL is connection, even though "authentication" is in permission
1598+ expect ( Telemetry . classifyError ( "SASL authentication failed" ) ) . toBe ( "connection" )
1599+ // parse_error wins over validation for "invalid syntax"
1600+ expect ( Telemetry . classifyError ( "parse error: invalid syntax" ) ) . toBe ( "parse_error" )
1601+ // permission ("forbidden") wins over http_error ("status code: 4")
1602+ expect ( Telemetry . classifyError ( "403 Forbidden, status code: 403" ) ) . toBe ( "permission" )
1603+ } )
1604+ // altimate_change end
1605+
15691606 test ( "returns unknown for unrecognized errors" , ( ) => {
15701607 expect ( Telemetry . classifyError ( "Something went wrong" ) ) . toBe ( "unknown" )
15711608 expect ( Telemetry . classifyError ( "" ) ) . toBe ( "unknown" )
@@ -1634,11 +1671,11 @@ describe("telemetry.computeInputSignature", () => {
16341671 expect ( sig ) . not . toContain ( "sk-abc123" )
16351672 expect ( sig ) . not . toContain ( "SELECT" )
16361673 expect ( sig ) . not . toContain ( "admin@example.com" )
1637- // Only type descriptors appear as values
1674+ // Only type descriptors appear as values; sensitive keys are fully redacted
16381675 const parsed = JSON . parse ( sig )
16391676 expect ( parsed . sql ) . toBe ( "string:60" )
1640- expect ( parsed . secret ) . toBe ( "string:16 " )
1641- expect ( parsed . api_key ) . toBe ( "string:9 " )
1677+ expect ( parsed . secret ) . toBe ( "**** " )
1678+ expect ( parsed . api_key ) . toBe ( "**** " )
16421679 } )
16431680
16441681 test ( "truncates output at 1000 chars with valid JSON" , ( ) => {
0 commit comments