From c479f51469e0144ddf5a9db3d5f9f2b070f6fbed Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Sat, 22 Aug 2026 00:23:51 +0800 Subject: [PATCH] refactor(ai-judge): split remaining hotspots and cover CRAP branches - stage-ify judgeAuthorize into auditEnrollment, runPreflightGates, prepareModelCall, and enforceAndEmit - extract tallyJoinedRows and tallyAttributable from computeMetrics, removing three dead locals - extract validateVerdictResponse from requestStructuredVerdict - extract collectUserTexts and charBudgetStart from buildConversationEvidence - table-drive corpus-replay parseArgs and split main into resolveReplayModel, selectCorpusCases, and replayCorpus - split analyzer cli main into loadReviewEvents, withinWindow, loadAuditEnrolled, and printReport with a run-as-script guard - add 81 tests covering parseEntry, extractBashCommandEvidence, validateVerdictResponse, forcedToolChoice, classifyGit dry-run paths, CLI arg/window/report rendering, and the infra-failure result path - add @vitest/coverage-istanbul for exact per-function CRAP scoring via fallow health --coverage --- coverage-final.json | 1 + packages/pi-permission-ai-judge/package.json | 2 + .../src/analyzer/analyze.ts | 157 ++-- .../src/analyzer/cli.ts | 187 ++-- .../src/conversation.ts | 73 +- packages/pi-permission-ai-judge/src/index.ts | 381 +++++--- packages/pi-permission-ai-judge/src/model.ts | 115 ++- .../test/analyzer/cli-args.test.ts | 292 ++++++ .../test/analyzer/cli-unit.test.ts | 214 +++++ .../test/catalog.test.ts | 55 ++ .../test/corpus-replay-harness.test.ts | 205 +++++ .../test/highrisk.test.ts | 5 + .../test/lifecycle.test.ts | 76 ++ .../pi-permission-ai-judge/test/model.test.ts | 236 ++++- .../tools/corpus-replay.ts | 214 +++-- packages/pi-permission-inner-cmd/package.json | 2 + .../test/authorizer.test.ts | 134 +++ pnpm-lock.yaml | 862 +++++++++++++++++- 18 files changed, 2756 insertions(+), 455 deletions(-) create mode 100644 coverage-final.json create mode 100644 packages/pi-permission-ai-judge/test/analyzer/cli-args.test.ts create mode 100644 packages/pi-permission-ai-judge/test/analyzer/cli-unit.test.ts create mode 100644 packages/pi-permission-ai-judge/test/corpus-replay-harness.test.ts diff --git a/coverage-final.json b/coverage-final.json new file mode 100644 index 0000000..8133f00 --- /dev/null +++ b/coverage-final.json @@ -0,0 +1 @@ +{"/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/audit.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/audit.ts", "statementMap": {"0": {"start": {"line": 44, "column": 27}, "end": {"line": 44, "column": null}}, "1": {"start": {"line": 45, "column": 23}, "end": {"line": 45, "column": null}}, "2": {"start": {"line": 48, "column": 16}, "end": {"line": 48, "column": null}}, "3": {"start": {"line": 48, "column": 29}, "end": {"line": 48, "column": null}}, "4": {"start": {"line": 49, "column": 16}, "end": {"line": 49, "column": null}}, "5": {"start": {"line": 50, "column": 17}, "end": {"line": 50, "column": null}}, "6": {"start": {"line": 51, "column": 18}, "end": {"line": 51, "column": null}}, "7": {"start": {"line": 53, "column": 4}, "end": {"line": 57, "column": null}}, "8": {"start": {"line": 54, "column": 8}, "end": {"line": 54, "column": null}}, "9": {"start": {"line": 56, "column": 8}, "end": {"line": 56, "column": null}}, "10": {"start": {"line": 59, "column": 4}, "end": {"line": 90, "column": null}}, "11": {"start": {"line": 61, "column": 12}, "end": {"line": 64, "column": null}}, "12": {"start": {"line": 63, "column": 16}, "end": {"line": 63, "column": null}}, "13": {"start": {"line": 65, "column": 27}, "end": {"line": 70, "column": null}}, "14": {"start": {"line": 72, "column": 12}, "end": {"line": 86, "column": null}}, "15": {"start": {"line": 73, "column": 16}, "end": {"line": 73, "column": null}}, "16": {"start": {"line": 74, "column": 16}, "end": {"line": 74, "column": null}}, "17": {"start": {"line": 75, "column": 16}, "end": {"line": 75, "column": null}}, "18": {"start": {"line": 77, "column": 16}, "end": {"line": 77, "column": null}}, "19": {"start": {"line": 79, "column": 16}, "end": {"line": 85, "column": null}}, "20": {"start": {"line": 80, "column": 20}, "end": {"line": 84, "column": null}}, "21": {"start": {"line": 81, "column": 24}, "end": {"line": 81, "column": null}}, "22": {"start": {"line": 88, "column": 23}, "end": {"line": 88, "column": null}}, "23": {"start": {"line": 89, "column": 20}, "end": {"line": 89, "column": null}}}, "fnMap": {"0": {"name": "createAuditLog", "decl": {"start": {"line": 47, "column": 16}, "end": {"line": 47, "column": 31}}, "loc": {"start": {"line": 47, "column": 61}, "end": {"line": 91, "column": null}}}, "1": {"name": "(anonymous_1)", "decl": {"start": {"line": 48, "column": 29}, "end": {"line": 48, "column": 35}}, "loc": {"start": {"line": 48, "column": 29}, "end": {"line": 48, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 60, "column": 15}, "end": {"line": 60, "column": 16}}, "loc": {"start": {"line": 60, "column": 35}, "end": {"line": 87, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 88, "column": 17}, "end": {"line": 88, "column": 23}}, "loc": {"start": {"line": 88, "column": 23}, "end": {"line": 88, "column": null}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 89, "column": 14}, "end": {"line": 89, "column": 20}}, "loc": {"start": {"line": 89, "column": 20}, "end": {"line": 89, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 48, "column": 16}, "end": {"line": 48, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 48, "column": 16}, "end": {"line": 48, "column": 29}}, {"start": {"line": 48, "column": 29}, "end": {"line": 48, "column": null}}]}, "1": {"loc": {"start": {"line": 61, "column": 12}, "end": {"line": 64, "column": null}}, "type": "if", "locations": [{"start": {"line": 61, "column": 12}, "end": {"line": 64, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 79, "column": 16}, "end": {"line": 85, "column": null}}, "type": "if", "locations": [{"start": {"line": 79, "column": 16}, "end": {"line": 85, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 24, "3": 45, "4": 24, "5": 24, "6": 24, "7": 24, "8": 24, "9": 1, "10": 24, "11": 49, "12": 2, "13": 47, "14": 47, "15": 47, "16": 46, "17": 46, "18": 1, "19": 47, "20": 46, "21": 46, "22": 21, "23": 0}, "f": {"0": 24, "1": 45, "2": 49, "3": 21, "4": 0}, "b": {"0": [24, 23], "1": [2, 47], "2": [46, 1]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/catalog.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/catalog.ts", "statementMap": {"0": {"start": {"line": 71, "column": 34}, "end": {"line": 71, "column": null}}, "1": {"start": {"line": 73, "column": 42}, "end": {"line": 76, "column": null}}, "2": {"start": {"line": 78, "column": 21}, "end": {"line": 78, "column": null}}, "3": {"start": {"line": 81, "column": 4}, "end": {"line": 81, "column": null}}, "4": {"start": {"line": 85, "column": 4}, "end": {"line": 87, "column": null}}, "5": {"start": {"line": 86, "column": 8}, "end": {"line": 86, "column": null}}, "6": {"start": {"line": 88, "column": 19}, "end": {"line": 88, "column": null}}, "7": {"start": {"line": 89, "column": 4}, "end": {"line": 93, "column": null}}, "8": {"start": {"line": 91, "column": 12}, "end": {"line": 92, "column": null}}, "9": {"start": {"line": 97, "column": 4}, "end": {"line": 99, "column": null}}, "10": {"start": {"line": 98, "column": 8}, "end": {"line": 98, "column": null}}, "11": {"start": {"line": 100, "column": 19}, "end": {"line": 100, "column": null}}, "12": {"start": {"line": 101, "column": 20}, "end": {"line": 101, "column": null}}, "13": {"start": {"line": 103, "column": 8}, "end": {"line": 121, "column": null}}, "14": {"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, "15": {"start": {"line": 123, "column": 8}, "end": {"line": 123, "column": null}}, "16": {"start": {"line": 125, "column": 37}, "end": {"line": 141, "column": null}}, "17": {"start": {"line": 142, "column": 4}, "end": {"line": 142, "column": null}}, "18": {"start": {"line": 150, "column": 17}, "end": {"line": 150, "column": null}}, "19": {"start": {"line": 150, "column": 50}, "end": {"line": 150, "column": null}}, "20": {"start": {"line": 152, "column": 4}, "end": {"line": 166, "column": null}}, "21": {"start": {"line": 153, "column": 8}, "end": {"line": 153, "column": null}}, "22": {"start": {"line": 155, "column": 8}, "end": {"line": 165, "column": null}}, "23": {"start": {"line": 169, "column": 4}, "end": {"line": 183, "column": null}}, "24": {"start": {"line": 170, "column": 8}, "end": {"line": 170, "column": null}}, "25": {"start": {"line": 172, "column": 8}, "end": {"line": 182, "column": null}}, "26": {"start": {"line": 185, "column": 4}, "end": {"line": 197, "column": null}}, "27": {"start": {"line": 191, "column": 8}, "end": {"line": 196, "column": null}}, "28": {"start": {"line": 198, "column": 19}, "end": {"line": 198, "column": null}}, "29": {"start": {"line": 199, "column": 4}, "end": {"line": 209, "column": null}}, "30": {"start": {"line": 200, "column": 8}, "end": {"line": 208, "column": null}}, "31": {"start": {"line": 211, "column": 45}, "end": {"line": 211, "column": null}}, "32": {"start": {"line": 212, "column": 4}, "end": {"line": 222, "column": null}}, "33": {"start": {"line": 213, "column": 8}, "end": {"line": 221, "column": null}}, "34": {"start": {"line": 223, "column": 41}, "end": {"line": 223, "column": null}}, "35": {"start": {"line": 224, "column": 4}, "end": {"line": 238, "column": null}}, "36": {"start": {"line": 224, "column": 21}, "end": {"line": 224, "column": 24}}, "37": {"start": {"line": 225, "column": 22}, "end": {"line": 225, "column": null}}, "38": {"start": {"line": 226, "column": 8}, "end": {"line": 236, "column": null}}, "39": {"start": {"line": 227, "column": 12}, "end": {"line": 235, "column": null}}, "40": {"start": {"line": 237, "column": 8}, "end": {"line": 237, "column": null}}, "41": {"start": {"line": 239, "column": 4}, "end": {"line": 245, "column": null}}, "42": {"start": {"line": 260, "column": 4}, "end": {"line": 264, "column": null}}, "43": {"start": {"line": 261, "column": 8}, "end": {"line": 263, "column": null}}, "44": {"start": {"line": 262, "column": 12}, "end": {"line": 262, "column": null}}, "45": {"start": {"line": 265, "column": 4}, "end": {"line": 265, "column": null}}, "46": {"start": {"line": 269, "column": 44}, "end": {"line": 271, "column": null}}}, "fnMap": {"0": {"name": "isNonEmptyString", "decl": {"start": {"line": 80, "column": 9}, "end": {"line": 80, "column": 26}}, "loc": {"start": {"line": 80, "column": 59}, "end": {"line": 82, "column": null}}}, "1": {"name": "isLatencySummary", "decl": {"start": {"line": 84, "column": 9}, "end": {"line": 84, "column": 26}}, "loc": {"start": {"line": 84, "column": 74}, "end": {"line": 94, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 90, "column": 8}, "end": {"line": 90, "column": 9}}, "loc": {"start": {"line": 91, "column": 12}, "end": {"line": 92, "column": null}}}, "3": {"name": "parseEntry", "decl": {"start": {"line": 96, "column": 9}, "end": {"line": 96, "column": 20}}, "loc": {"start": {"line": 96, "column": 62}, "end": {"line": 143, "column": null}}}, "4": {"name": "loadModelCatalog", "decl": {"start": {"line": 146, "column": 16}, "end": {"line": 146, "column": 33}}, "loc": {"start": {"line": 149, "column": 2}, "end": {"line": 246, "column": null}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 150, "column": 35}, "end": {"line": 150, "column": 36}}, "loc": {"start": {"line": 150, "column": 50}, "end": {"line": 150, "column": null}}}, "6": {"name": "classifyModel", "decl": {"start": {"line": 255, "column": 16}, "end": {"line": 255, "column": null}}, "loc": {"start": {"line": 259, "column": 30}, "end": {"line": 266, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 81, "column": 11}, "end": {"line": 81, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 81, "column": 11}, "end": {"line": 81, "column": 40}}, {"start": {"line": 81, "column": 40}, "end": {"line": 81, "column": null}}]}, "1": {"loc": {"start": {"line": 85, "column": 4}, "end": {"line": 87, "column": null}}, "type": "if", "locations": [{"start": {"line": 85, "column": 4}, "end": {"line": 87, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 85, "column": 8}, "end": {"line": 85, "column": 77}}, "type": "binary-expr", "locations": [{"start": {"line": 85, "column": 8}, "end": {"line": 85, "column": 37}}, {"start": {"line": 85, "column": 37}, "end": {"line": 85, "column": 55}}, {"start": {"line": 85, "column": 55}, "end": {"line": 85, "column": 77}}]}, "3": {"loc": {"start": {"line": 91, "column": 12}, "end": {"line": 92, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 91, "column": 12}, "end": {"line": 91, "column": null}}, {"start": {"line": 92, "column": 13}, "end": {"line": 92, "column": 48}}, {"start": {"line": 92, "column": 48}, "end": {"line": 92, "column": null}}]}, "4": {"loc": {"start": {"line": 97, "column": 4}, "end": {"line": 99, "column": null}}, "type": "if", "locations": [{"start": {"line": 97, "column": 4}, "end": {"line": 99, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 97, "column": 8}, "end": {"line": 97, "column": 77}}, "type": "binary-expr", "locations": [{"start": {"line": 97, "column": 8}, "end": {"line": 97, "column": 37}}, {"start": {"line": 97, "column": 37}, "end": {"line": 97, "column": 55}}, {"start": {"line": 97, "column": 55}, "end": {"line": 97, "column": 77}}]}, "6": {"loc": {"start": {"line": 103, "column": 8}, "end": {"line": 121, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 103, "column": 8}, "end": {"line": 103, "column": null}}, {"start": {"line": 104, "column": 8}, "end": {"line": 104, "column": null}}, {"start": {"line": 105, "column": 8}, "end": {"line": 105, "column": null}}, {"start": {"line": 106, "column": 9}, "end": {"line": 106, "column": null}}, {"start": {"line": 107, "column": 12}, "end": {"line": 107, "column": null}}, {"start": {"line": 108, "column": 12}, "end": {"line": 108, "column": null}}, {"start": {"line": 109, "column": 8}, "end": {"line": 109, "column": null}}, {"start": {"line": 110, "column": 8}, "end": {"line": 110, "column": null}}, {"start": {"line": 111, "column": 8}, "end": {"line": 111, "column": null}}, {"start": {"line": 112, "column": 8}, "end": {"line": 112, "column": null}}, {"start": {"line": 113, "column": 8}, "end": {"line": 113, "column": null}}, {"start": {"line": 114, "column": 8}, "end": {"line": 114, "column": null}}, {"start": {"line": 115, "column": 8}, "end": {"line": 115, "column": null}}, {"start": {"line": 116, "column": 8}, "end": {"line": 116, "column": null}}, {"start": {"line": 117, "column": 8}, "end": {"line": 117, "column": null}}, {"start": {"line": 118, "column": 8}, "end": {"line": 118, "column": null}}, {"start": {"line": 119, "column": 8}, "end": {"line": 119, "column": null}}, {"start": {"line": 120, "column": 8}, "end": {"line": 120, "column": null}}, {"start": {"line": 121, "column": 9}, "end": {"line": 121, "column": 39}}, {"start": {"line": 121, "column": 39}, "end": {"line": 121, "column": null}}]}, "7": {"loc": {"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, "type": "if", "locations": [{"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 138, "column": 12}, "end": {"line": 140, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 139, "column": 14}, "end": {"line": 139, "column": null}}, {"start": {"line": 140, "column": 14}, "end": {"line": 140, "column": null}}]}, "9": {"loc": {"start": {"line": 150, "column": 17}, "end": {"line": 150, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 150, "column": 17}, "end": {"line": 150, "column": 35}}, {"start": {"line": 150, "column": 35}, "end": {"line": 150, "column": null}}]}, "10": {"loc": {"start": {"line": 161, "column": 24}, "end": {"line": 161, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 161, "column": 49}, "end": {"line": 161, "column": 65}}, {"start": {"line": 161, "column": 65}, "end": {"line": 161, "column": null}}]}, "11": {"loc": {"start": {"line": 178, "column": 24}, "end": {"line": 178, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 178, "column": 49}, "end": {"line": 178, "column": 65}}, {"start": {"line": 178, "column": 65}, "end": {"line": 178, "column": null}}]}, "12": {"loc": {"start": {"line": 185, "column": 4}, "end": {"line": 197, "column": null}}, "type": "if", "locations": [{"start": {"line": 185, "column": 4}, "end": {"line": 197, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 186, "column": 8}, "end": {"line": 189, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 186, "column": 8}, "end": {"line": 186, "column": null}}, {"start": {"line": 187, "column": 8}, "end": {"line": 187, "column": null}}, {"start": {"line": 188, "column": 8}, "end": {"line": 188, "column": null}}, {"start": {"line": 189, "column": 8}, "end": {"line": 189, "column": null}}]}, "14": {"loc": {"start": {"line": 199, "column": 4}, "end": {"line": 209, "column": null}}, "type": "if", "locations": [{"start": {"line": 199, "column": 4}, "end": {"line": 209, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 212, "column": 4}, "end": {"line": 222, "column": null}}, "type": "if", "locations": [{"start": {"line": 212, "column": 4}, "end": {"line": 222, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 226, "column": 8}, "end": {"line": 236, "column": null}}, "type": "if", "locations": [{"start": {"line": 226, "column": 8}, "end": {"line": 236, "column": null}}, {"start": {}, "end": {}}]}, "17": {"loc": {"start": {"line": 261, "column": 8}, "end": {"line": 263, "column": null}}, "type": "if", "locations": [{"start": {"line": 261, "column": 8}, "end": {"line": 263, "column": null}}, {"start": {}, "end": {}}]}, "18": {"loc": {"start": {"line": 261, "column": 12}, "end": {"line": 261, "column": 66}}, "type": "binary-expr", "locations": [{"start": {"line": 261, "column": 12}, "end": {"line": 261, "column": 43}}, {"start": {"line": 261, "column": 43}, "end": {"line": 261, "column": 66}}]}}, "s": {"0": 2, "1": 2, "2": 2, "3": 126, "4": 11, "5": 1, "6": 10, "7": 10, "8": 28, "9": 26, "10": 3, "11": 23, "12": 23, "13": 23, "14": 23, "15": 17, "16": 6, "17": 6, "18": 28, "19": 0, "20": 28, "21": 28, "22": 2, "23": 26, "24": 26, "25": 1, "26": 25, "27": 0, "28": 25, "29": 25, "30": 1, "31": 24, "32": 24, "33": 0, "34": 24, "35": 24, "36": 24, "37": 26, "38": 26, "39": 20, "40": 6, "41": 4, "42": 16, "43": 15, "44": 6, "45": 10, "46": 2}, "f": {"0": 126, "1": 11, "2": 28, "3": 26, "4": 28, "5": 0, "6": 16}, "b": {"0": [126, 125], "1": [1, 10], "2": [11, 10, 10], "3": [28, 24, 22], "4": [3, 23], "5": [26, 25, 24], "6": [23, 22, 20, 19, 3, 2, 18, 17, 16, 15, 15, 14, 13, 13, 12, 12, 11, 8, 7, 2], "7": [17, 6], "8": [5, 1], "9": [28, 0], "10": [2, 0], "11": [1, 0], "12": [0, 25], "13": [25, 25, 25, 25], "14": [1, 24], "15": [0, 24], "16": [20, 6], "17": [6, 9], "18": [15, 8]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/config.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/config.ts", "statementMap": {"0": {"start": {"line": 60, "column": 24}, "end": {"line": 60, "column": null}}, "1": {"start": {"line": 61, "column": 45}, "end": {"line": 68, "column": null}}, "2": {"start": {"line": 71, "column": 4}, "end": {"line": 74, "column": null}}, "3": {"start": {"line": 78, "column": 4}, "end": {"line": 78, "column": null}}, "4": {"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, "5": {"start": {"line": 83, "column": 8}, "end": {"line": 83, "column": null}}, "6": {"start": {"line": 85, "column": 19}, "end": {"line": 85, "column": null}}, "7": {"start": {"line": 86, "column": 4}, "end": {"line": 88, "column": null}}, "8": {"start": {"line": 87, "column": 8}, "end": {"line": 87, "column": null}}, "9": {"start": {"line": 89, "column": 4}, "end": {"line": 92, "column": null}}, "10": {"start": {"line": 101, "column": 4}, "end": {"line": 103, "column": null}}, "11": {"start": {"line": 102, "column": 8}, "end": {"line": 102, "column": null}}, "12": {"start": {"line": 104, "column": 4}, "end": {"line": 106, "column": null}}, "13": {"start": {"line": 105, "column": 8}, "end": {"line": 105, "column": null}}, "14": {"start": {"line": 107, "column": 4}, "end": {"line": 109, "column": null}}, "15": {"start": {"line": 116, "column": 44}, "end": {"line": 116, "column": null}}, "16": {"start": {"line": 117, "column": 26}, "end": {"line": 117, "column": null}}, "17": {"start": {"line": 118, "column": 4}, "end": {"line": 128, "column": null}}, "18": {"start": {"line": 119, "column": 8}, "end": {"line": 127, "column": null}}, "19": {"start": {"line": 120, "column": 12}, "end": {"line": 120, "column": null}}, "20": {"start": {"line": 122, "column": 12}, "end": {"line": 126, "column": null}}, "21": {"start": {"line": 129, "column": 4}, "end": {"line": 129, "column": null}}, "22": {"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, "23": {"start": {"line": 146, "column": 8}, "end": {"line": 146, "column": null}}, "24": {"start": {"line": 148, "column": 4}, "end": {"line": 164, "column": null}}, "25": {"start": {"line": 149, "column": 27}, "end": {"line": 149, "column": null}}, "26": {"start": {"line": 150, "column": 8}, "end": {"line": 162, "column": null}}, "27": {"start": {"line": 151, "column": 12}, "end": {"line": 161, "column": null}}, "28": {"start": {"line": 163, "column": 8}, "end": {"line": 163, "column": null}}, "29": {"start": {"line": 165, "column": 4}, "end": {"line": 175, "column": null}}, "30": {"start": {"line": 188, "column": 4}, "end": {"line": 194, "column": null}}, "31": {"start": {"line": 189, "column": 8}, "end": {"line": 193, "column": null}}, "32": {"start": {"line": 195, "column": 18}, "end": {"line": 195, "column": null}}, "33": {"start": {"line": 196, "column": 4}, "end": {"line": 207, "column": null}}, "34": {"start": {"line": 202, "column": 8}, "end": {"line": 206, "column": null}}, "35": {"start": {"line": 208, "column": 4}, "end": {"line": 218, "column": null}}, "36": {"start": {"line": 230, "column": 17}, "end": {"line": 230, "column": null}}, "37": {"start": {"line": 230, "column": 50}, "end": {"line": 230, "column": null}}, "38": {"start": {"line": 231, "column": 17}, "end": {"line": 231, "column": null}}, "39": {"start": {"line": 233, "column": 4}, "end": {"line": 239, "column": null}}, "40": {"start": {"line": 234, "column": 8}, "end": {"line": 234, "column": null}}, "41": {"start": {"line": 236, "column": 8}, "end": {"line": 238, "column": null}}, "42": {"start": {"line": 242, "column": 4}, "end": {"line": 248, "column": null}}, "43": {"start": {"line": 243, "column": 8}, "end": {"line": 243, "column": null}}, "44": {"start": {"line": 245, "column": 8}, "end": {"line": 247, "column": null}}, "45": {"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, "46": {"start": {"line": 251, "column": 8}, "end": {"line": 251, "column": null}}, "47": {"start": {"line": 254, "column": 19}, "end": {"line": 254, "column": null}}, "48": {"start": {"line": 255, "column": 44}, "end": {"line": 255, "column": null}}, "49": {"start": {"line": 257, "column": 26}, "end": {"line": 257, "column": null}}, "50": {"start": {"line": 258, "column": 4}, "end": {"line": 265, "column": null}}, "51": {"start": {"line": 259, "column": 8}, "end": {"line": 264, "column": null}}, "52": {"start": {"line": 266, "column": 26}, "end": {"line": 266, "column": null}}, "53": {"start": {"line": 268, "column": 23}, "end": {"line": 268, "column": null}}, "54": {"start": {"line": 269, "column": 4}, "end": {"line": 269, "column": null}}, "55": {"start": {"line": 270, "column": 15}, "end": {"line": 270, "column": null}}, "56": {"start": {"line": 273, "column": 4}, "end": {"line": 281, "column": null}}, "57": {"start": {"line": 274, "column": 8}, "end": {"line": 274, "column": null}}, "58": {"start": {"line": 275, "column": 8}, "end": {"line": 280, "column": null}}, "59": {"start": {"line": 283, "column": 24}, "end": {"line": 283, "column": null}}, "60": {"start": {"line": 284, "column": 4}, "end": {"line": 284, "column": null}}, "61": {"start": {"line": 285, "column": 4}, "end": {"line": 287, "column": null}}, "62": {"start": {"line": 286, "column": 8}, "end": {"line": 286, "column": null}}, "63": {"start": {"line": 289, "column": 26}, "end": {"line": 289, "column": null}}, "64": {"start": {"line": 290, "column": 4}, "end": {"line": 290, "column": null}}, "65": {"start": {"line": 292, "column": 4}, "end": {"line": 299, "column": null}}}, "fnMap": {"0": {"name": "fileDefaults", "decl": {"start": {"line": 70, "column": 9}, "end": {"line": 70, "column": 22}}, "loc": {"start": {"line": 70, "column": 61}, "end": {"line": 75, "column": null}}}, "1": {"name": "isNonEmptyString", "decl": {"start": {"line": 77, "column": 9}, "end": {"line": 77, "column": 26}}, "loc": {"start": {"line": 77, "column": 59}, "end": {"line": 79, "column": null}}}, "2": {"name": "parseJudgeModel", "decl": {"start": {"line": 81, "column": 9}, "end": {"line": 81, "column": 25}}, "loc": {"start": {"line": 81, "column": 74}, "end": {"line": 93, "column": null}}}, "3": {"name": "parseConfigVersion", "decl": {"start": {"line": 96, "column": 9}, "end": {"line": 96, "column": null}}, "loc": {"start": {"line": 98, "column": 44}, "end": {"line": 110, "column": null}}}, "4": {"name": "parseMode", "decl": {"start": {"line": 113, "column": 9}, "end": {"line": 113, "column": null}}, "loc": {"start": {"line": 115, "column": 56}, "end": {"line": 130, "column": null}}}, "5": {"name": "parseJudgeModelField", "decl": {"start": {"line": 137, "column": 9}, "end": {"line": 137, "column": null}}, "loc": {"start": {"line": 144, "column": 2}, "end": {"line": 176, "column": null}}}, "6": {"name": "parseTimeout", "decl": {"start": {"line": 183, "column": 9}, "end": {"line": 183, "column": 22}}, "loc": {"start": {"line": 187, "column": 2}, "end": {"line": 219, "column": null}}}, "7": {"name": "loadJudgeConfig", "decl": {"start": {"line": 227, "column": 16}, "end": {"line": 227, "column": null}}, "loc": {"start": {"line": 229, "column": 24}, "end": {"line": 300, "column": null}}}, "8": {"name": "(anonymous_8)", "decl": {"start": {"line": 230, "column": 35}, "end": {"line": 230, "column": 36}}, "loc": {"start": {"line": 230, "column": 50}, "end": {"line": 230, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 78, "column": 11}, "end": {"line": 78, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 78, "column": 11}, "end": {"line": 78, "column": 40}}, {"start": {"line": 78, "column": 40}, "end": {"line": 78, "column": null}}]}, "1": {"loc": {"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, "type": "if", "locations": [{"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 82, "column": 8}, "end": {"line": 82, "column": 77}}, "type": "binary-expr", "locations": [{"start": {"line": 82, "column": 8}, "end": {"line": 82, "column": 37}}, {"start": {"line": 82, "column": 37}, "end": {"line": 82, "column": 55}}, {"start": {"line": 82, "column": 55}, "end": {"line": 82, "column": 77}}]}, "3": {"loc": {"start": {"line": 86, "column": 4}, "end": {"line": 88, "column": null}}, "type": "if", "locations": [{"start": {"line": 86, "column": 4}, "end": {"line": 88, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 86, "column": 8}, "end": {"line": 86, "column": 76}}, "type": "binary-expr", "locations": [{"start": {"line": 86, "column": 8}, "end": {"line": 86, "column": 46}}, {"start": {"line": 86, "column": 46}, "end": {"line": 86, "column": 76}}]}, "5": {"loc": {"start": {"line": 101, "column": 4}, "end": {"line": 103, "column": null}}, "type": "if", "locations": [{"start": {"line": 101, "column": 4}, "end": {"line": 103, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 104, "column": 4}, "end": {"line": 106, "column": null}}, "type": "if", "locations": [{"start": {"line": 104, "column": 4}, "end": {"line": 106, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 104, "column": 8}, "end": {"line": 104, "column": 54}}, "type": "binary-expr", "locations": [{"start": {"line": 104, "column": 8}, "end": {"line": 104, "column": 32}}, {"start": {"line": 104, "column": 32}, "end": {"line": 104, "column": 54}}]}, "8": {"loc": {"start": {"line": 118, "column": 4}, "end": {"line": 128, "column": null}}, "type": "if", "locations": [{"start": {"line": 118, "column": 4}, "end": {"line": 128, "column": null}}, {"start": {}, "end": {}}]}, "9": {"loc": {"start": {"line": 119, "column": 8}, "end": {"line": 127, "column": null}}, "type": "if", "locations": [{"start": {"line": 119, "column": 8}, "end": {"line": 127, "column": null}}, {"start": {"line": 121, "column": 15}, "end": {"line": 127, "column": null}}]}, "10": {"loc": {"start": {"line": 119, "column": 12}, "end": {"line": 119, "column": 67}}, "type": "binary-expr", "locations": [{"start": {"line": 119, "column": 12}, "end": {"line": 119, "column": 40}}, {"start": {"line": 119, "column": 40}, "end": {"line": 119, "column": 67}}]}, "11": {"loc": {"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, "type": "if", "locations": [{"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 148, "column": 4}, "end": {"line": 164, "column": null}}, "type": "if", "locations": [{"start": {"line": 148, "column": 4}, "end": {"line": 164, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 150, "column": 8}, "end": {"line": 162, "column": null}}, "type": "if", "locations": [{"start": {"line": 150, "column": 8}, "end": {"line": 162, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 188, "column": 4}, "end": {"line": 194, "column": null}}, "type": "if", "locations": [{"start": {"line": 188, "column": 4}, "end": {"line": 194, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 196, "column": 4}, "end": {"line": 207, "column": null}}, "type": "if", "locations": [{"start": {"line": 196, "column": 4}, "end": {"line": 207, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 197, "column": 8}, "end": {"line": 200, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 197, "column": 8}, "end": {"line": 197, "column": null}}, {"start": {"line": 198, "column": 8}, "end": {"line": 198, "column": null}}, {"start": {"line": 199, "column": 8}, "end": {"line": 199, "column": null}}, {"start": {"line": 200, "column": 8}, "end": {"line": 200, "column": null}}]}, "17": {"loc": {"start": {"line": 204, "column": 27}, "end": {"line": 204, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 204, "column": 58}, "end": {"line": 204, "column": 70}}, {"start": {"line": 204, "column": 70}, "end": {"line": 204, "column": null}}]}, "18": {"loc": {"start": {"line": 230, "column": 17}, "end": {"line": 230, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 230, "column": 17}, "end": {"line": 230, "column": 35}}, {"start": {"line": 230, "column": 35}, "end": {"line": 230, "column": null}}]}, "19": {"loc": {"start": {"line": 237, "column": 47}, "end": {"line": 237, "column": 101}}, "type": "cond-expr", "locations": [{"start": {"line": 237, "column": 72}, "end": {"line": 237, "column": 88}}, {"start": {"line": 237, "column": 88}, "end": {"line": 237, "column": 101}}]}, "20": {"loc": {"start": {"line": 246, "column": 31}, "end": {"line": 246, "column": 85}}, "type": "cond-expr", "locations": [{"start": {"line": 246, "column": 56}, "end": {"line": 246, "column": 72}}, {"start": {"line": 246, "column": 72}, "end": {"line": 246, "column": 85}}]}, "21": {"loc": {"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, "type": "if", "locations": [{"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, {"start": {}, "end": {}}]}, "22": {"loc": {"start": {"line": 250, "column": 8}, "end": {"line": 250, "column": 80}}, "type": "binary-expr", "locations": [{"start": {"line": 250, "column": 8}, "end": {"line": 250, "column": 38}}, {"start": {"line": 250, "column": 38}, "end": {"line": 250, "column": 57}}, {"start": {"line": 250, "column": 57}, "end": {"line": 250, "column": 80}}]}, "23": {"loc": {"start": {"line": 258, "column": 4}, "end": {"line": 265, "column": null}}, "type": "if", "locations": [{"start": {"line": 258, "column": 4}, "end": {"line": 265, "column": null}}, {"start": {}, "end": {}}]}, "24": {"loc": {"start": {"line": 273, "column": 4}, "end": {"line": 281, "column": null}}, "type": "if", "locations": [{"start": {"line": 273, "column": 4}, "end": {"line": 281, "column": null}}, {"start": {}, "end": {}}]}, "25": {"loc": {"start": {"line": 273, "column": 8}, "end": {"line": 273, "column": 51}}, "type": "binary-expr", "locations": [{"start": {"line": 273, "column": 8}, "end": {"line": 273, "column": 31}}, {"start": {"line": 273, "column": 31}, "end": {"line": 273, "column": 51}}]}, "26": {"loc": {"start": {"line": 285, "column": 4}, "end": {"line": 287, "column": null}}, "type": "if", "locations": [{"start": {"line": 285, "column": 4}, "end": {"line": 287, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 8, "3": 21, "4": 14, "5": 2, "6": 12, "7": 12, "8": 5, "9": 7, "10": 48, "11": 5, "12": 43, "13": 42, "14": 1, "15": 47, "16": 47, "17": 47, "18": 26, "19": 25, "20": 1, "21": 47, "22": 47, "23": 32, "24": 15, "25": 14, "26": 14, "27": 7, "28": 7, "29": 1, "30": 47, "31": 34, "32": 13, "33": 13, "34": 5, "35": 8, "36": 56, "37": 19, "38": 56, "39": 56, "40": 56, "41": 6, "42": 50, "43": 50, "44": 1, "45": 49, "46": 1, "47": 48, "48": 48, "49": 48, "50": 48, "51": 1, "52": 47, "53": 47, "54": 47, "55": 47, "56": 47, "57": 3, "58": 3, "59": 47, "60": 47, "61": 47, "62": 7, "63": 47, "64": 47, "65": 47}, "f": {"0": 8, "1": 21, "2": 14, "3": 48, "4": 47, "5": 47, "6": 47, "7": 56, "8": 19}, "b": {"0": [21, 18], "1": [2, 12], "2": [14, 13, 13], "3": [5, 7], "4": [12, 9], "5": [5, 43], "6": [42, 1], "7": [43, 41], "8": [26, 21], "9": [25, 1], "10": [26, 17], "11": [32, 15], "12": [14, 1], "13": [7, 7], "14": [34, 13], "15": [5, 8], "16": [13, 10, 9, 6], "17": [1, 4], "18": [56, 19], "19": [6, 0], "20": [1, 0], "21": [1, 48], "22": [49, 49, 49], "23": [1, 47], "24": [3, 44], "25": [47, 7], "26": [7, 40]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/conversation.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/conversation.ts", "statementMap": {"0": {"start": {"line": 22, "column": 31}, "end": {"line": 22, "column": null}}, "1": {"start": {"line": 23, "column": 31}, "end": {"line": 23, "column": null}}, "2": {"start": {"line": 60, "column": 4}, "end": {"line": 66, "column": null}}, "3": {"start": {"line": 62, "column": 12}, "end": {"line": 65, "column": null}}, "4": {"start": {"line": 70, "column": 4}, "end": {"line": 70, "column": null}}, "5": {"start": {"line": 75, "column": 4}, "end": {"line": 77, "column": null}}, "6": {"start": {"line": 76, "column": 8}, "end": {"line": 76, "column": null}}, "7": {"start": {"line": 78, "column": 20}, "end": {"line": 78, "column": null}}, "8": {"start": {"line": 79, "column": 4}, "end": {"line": 81, "column": null}}, "9": {"start": {"line": 80, "column": 8}, "end": {"line": 80, "column": null}}, "10": {"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, "11": {"start": {"line": 83, "column": 8}, "end": {"line": 83, "column": null}}, "12": {"start": {"line": 85, "column": 18}, "end": {"line": 90, "column": null}}, "13": {"start": {"line": 88, "column": 16}, "end": {"line": 88, "column": null}}, "14": {"start": {"line": 90, "column": 23}, "end": {"line": 90, "column": 32}}, "15": {"start": {"line": 91, "column": 4}, "end": {"line": 91, "column": null}}, "16": {"start": {"line": 101, "column": 32}, "end": {"line": 101, "column": null}}, "17": {"start": {"line": 102, "column": 24}, "end": {"line": 102, "column": null}}, "18": {"start": {"line": 104, "column": 4}, "end": {"line": 124, "column": null}}, "19": {"start": {"line": 105, "column": 16}, "end": {"line": 105, "column": null}}, "20": {"start": {"line": 109, "column": 22}, "end": {"line": 109, "column": null}}, "21": {"start": {"line": 110, "column": 8}, "end": {"line": 112, "column": null}}, "22": {"start": {"line": 111, "column": 12}, "end": {"line": 111, "column": null}}, "23": {"start": {"line": 113, "column": 8}, "end": {"line": 116, "column": null}}, "24": {"start": {"line": 114, "column": 12}, "end": {"line": 114, "column": null}}, "25": {"start": {"line": 115, "column": 12}, "end": {"line": 115, "column": null}}, "26": {"start": {"line": 117, "column": 8}, "end": {"line": 119, "column": null}}, "27": {"start": {"line": 118, "column": 12}, "end": {"line": 118, "column": null}}, "28": {"start": {"line": 120, "column": 21}, "end": {"line": 120, "column": null}}, "29": {"start": {"line": 121, "column": 8}, "end": {"line": 123, "column": null}}, "30": {"start": {"line": 122, "column": 12}, "end": {"line": 122, "column": null}}, "31": {"start": {"line": 125, "column": 4}, "end": {"line": 125, "column": null}}, "32": {"start": {"line": 134, "column": 19}, "end": {"line": 134, "column": null}}, "33": {"start": {"line": 135, "column": 4}, "end": {"line": 140, "column": null}}, "34": {"start": {"line": 135, "column": 17}, "end": {"line": 135, "column": 20}}, "35": {"start": {"line": 136, "column": 8}, "end": {"line": 136, "column": null}}, "36": {"start": {"line": 137, "column": 8}, "end": {"line": 139, "column": null}}, "37": {"start": {"line": 138, "column": 12}, "end": {"line": 138, "column": null}}, "38": {"start": {"line": 141, "column": 4}, "end": {"line": 141, "column": null}}, "39": {"start": {"line": 156, "column": 20}, "end": {"line": 156, "column": null}}, "40": {"start": {"line": 157, "column": 48}, "end": {"line": 157, "column": null}}, "41": {"start": {"line": 159, "column": 17}, "end": {"line": 159, "column": null}}, "42": {"start": {"line": 160, "column": 23}, "end": {"line": 160, "column": null}}, "43": {"start": {"line": 161, "column": 22}, "end": {"line": 161, "column": null}}, "44": {"start": {"line": 165, "column": 18}, "end": {"line": 165, "column": null}}, "45": {"start": {"line": 166, "column": 23}, "end": {"line": 168, "column": null}}, "46": {"start": {"line": 168, "column": 31}, "end": {"line": 168, "column": 84}}, "47": {"start": {"line": 169, "column": 21}, "end": {"line": 172, "column": null}}, "48": {"start": {"line": 170, "column": 23}, "end": {"line": 170, "column": null}}, "49": {"start": {"line": 174, "column": 4}, "end": {"line": 179, "column": null}}, "50": {"start": {"line": 183, "column": 16}, "end": {"line": 183, "column": null}}, "51": {"start": {"line": 184, "column": 4}, "end": {"line": 191, "column": null}}, "52": {"start": {"line": 185, "column": 8}, "end": {"line": 187, "column": null}}, "53": {"start": {"line": 186, "column": 12}, "end": {"line": 186, "column": null}}, "54": {"start": {"line": 188, "column": 8}, "end": {"line": 190, "column": null}}, "55": {"start": {"line": 189, "column": 12}, "end": {"line": 189, "column": null}}, "56": {"start": {"line": 192, "column": 4}, "end": {"line": 192, "column": null}}}, "fnMap": {"0": {"name": "conversationProbeFromSession", "decl": {"start": {"line": 57, "column": 16}, "end": {"line": 57, "column": null}}, "loc": {"start": {"line": 59, "column": 21}, "end": {"line": 67, "column": null}}}, "1": {"name": "(anonymous_1)", "decl": {"start": {"line": 61, "column": 26}, "end": {"line": 61, "column": null}}, "loc": {"start": {"line": 62, "column": 12}, "end": {"line": 65, "column": null}}}, "2": {"name": "isRecord", "decl": {"start": {"line": 69, "column": 9}, "end": {"line": 69, "column": 18}}, "loc": {"start": {"line": 69, "column": 68}, "end": {"line": 71, "column": null}}}, "3": {"name": "userTextFrom", "decl": {"start": {"line": 74, "column": 9}, "end": {"line": 74, "column": 22}}, "loc": {"start": {"line": 74, "column": 55}, "end": {"line": 92, "column": null}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 87, "column": 12}, "end": {"line": 87, "column": 13}}, "loc": {"start": {"line": 88, "column": 16}, "end": {"line": 88, "column": null}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 90, "column": 13}, "end": {"line": 90, "column": 14}}, "loc": {"start": {"line": 90, "column": 23}, "end": {"line": 90, "column": 32}}}, "6": {"name": "collectUserTexts", "decl": {"start": {"line": 98, "column": 9}, "end": {"line": 98, "column": null}}, "loc": {"start": {"line": 100, "column": 47}, "end": {"line": 126, "column": null}}}, "7": {"name": "charBudgetStart", "decl": {"start": {"line": 133, "column": 9}, "end": {"line": 133, "column": 25}}, "loc": {"start": {"line": 133, "column": 58}, "end": {"line": 142, "column": null}}}, "8": {"name": "buildConversationEvidence", "decl": {"start": {"line": 153, "column": 16}, "end": {"line": 153, "column": null}}, "loc": {"start": {"line": 155, "column": 24}, "end": {"line": 180, "column": null}}}, "9": {"name": "(anonymous_9)", "decl": {"start": {"line": 168, "column": 13}, "end": {"line": 168, "column": 14}}, "loc": {"start": {"line": 168, "column": 31}, "end": {"line": 168, "column": 84}}}, "10": {"name": "(anonymous_10)", "decl": {"start": {"line": 170, "column": 8}, "end": {"line": 170, "column": 9}}, "loc": {"start": {"line": 170, "column": 23}, "end": {"line": 170, "column": null}}}, "11": {"name": "countUserEntries", "decl": {"start": {"line": 182, "column": 9}, "end": {"line": 182, "column": 26}}, "loc": {"start": {"line": 182, "column": 63}, "end": {"line": 193, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 64, "column": 16}, "end": {"line": 64, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 64, "column": 16}, "end": {"line": 64, "column": 39}}, {"start": {"line": 64, "column": 39}, "end": {"line": 64, "column": null}}]}, "1": {"loc": {"start": {"line": 70, "column": 11}, "end": {"line": 70, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 70, "column": 11}, "end": {"line": 70, "column": 40}}, {"start": {"line": 70, "column": 40}, "end": {"line": 70, "column": 58}}, {"start": {"line": 70, "column": 58}, "end": {"line": 70, "column": null}}]}, "2": {"loc": {"start": {"line": 75, "column": 4}, "end": {"line": 77, "column": null}}, "type": "if", "locations": [{"start": {"line": 75, "column": 4}, "end": {"line": 77, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 75, "column": 8}, "end": {"line": 75, "column": 55}}, "type": "binary-expr", "locations": [{"start": {"line": 75, "column": 8}, "end": {"line": 75, "column": 30}}, {"start": {"line": 75, "column": 30}, "end": {"line": 75, "column": 55}}]}, "4": {"loc": {"start": {"line": 79, "column": 4}, "end": {"line": 81, "column": null}}, "type": "if", "locations": [{"start": {"line": 79, "column": 4}, "end": {"line": 81, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 80, "column": 15}, "end": {"line": 80, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 80, "column": 43}, "end": {"line": 80, "column": 53}}, {"start": {"line": 80, "column": 53}, "end": {"line": 80, "column": null}}]}, "6": {"loc": {"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, "type": "if", "locations": [{"start": {"line": 82, "column": 4}, "end": {"line": 84, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 88, "column": 16}, "end": {"line": 88, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 88, "column": 16}, "end": {"line": 88, "column": 34}}, {"start": {"line": 88, "column": 34}, "end": {"line": 88, "column": 58}}, {"start": {"line": 88, "column": 58}, "end": {"line": 88, "column": null}}]}, "8": {"loc": {"start": {"line": 91, "column": 11}, "end": {"line": 91, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 91, "column": 30}, "end": {"line": 91, "column": 49}}, {"start": {"line": 91, "column": 49}, "end": {"line": 91, "column": null}}]}, "9": {"loc": {"start": {"line": 106, "column": 8}, "end": {"line": 106, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 106, "column": 8}, "end": {"line": 106, "column": 18}}, {"start": {"line": 106, "column": 18}, "end": {"line": 106, "column": null}}]}, "10": {"loc": {"start": {"line": 110, "column": 8}, "end": {"line": 112, "column": null}}, "type": "if", "locations": [{"start": {"line": 110, "column": 8}, "end": {"line": 112, "column": null}}, {"start": {}, "end": {}}]}, "11": {"loc": {"start": {"line": 113, "column": 8}, "end": {"line": 116, "column": null}}, "type": "if", "locations": [{"start": {"line": 113, "column": 8}, "end": {"line": 116, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 117, "column": 8}, "end": {"line": 119, "column": null}}, "type": "if", "locations": [{"start": {"line": 117, "column": 8}, "end": {"line": 119, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 121, "column": 8}, "end": {"line": 123, "column": null}}, "type": "if", "locations": [{"start": {"line": 121, "column": 8}, "end": {"line": 123, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 136, "column": 20}, "end": {"line": 136, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 136, "column": 20}, "end": {"line": 136, "column": 39}}, {"start": {"line": 136, "column": 39}, "end": {"line": 136, "column": null}}]}, "15": {"loc": {"start": {"line": 137, "column": 8}, "end": {"line": 139, "column": null}}, "type": "if", "locations": [{"start": {"line": 137, "column": 8}, "end": {"line": 139, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 177, "column": 19}, "end": {"line": 177, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 177, "column": 19}, "end": {"line": 177, "column": 32}}, {"start": {"line": 177, "column": 32}, "end": {"line": 177, "column": null}}]}, "17": {"loc": {"start": {"line": 185, "column": 8}, "end": {"line": 187, "column": null}}, "type": "if", "locations": [{"start": {"line": 185, "column": 8}, "end": {"line": 187, "column": null}}, {"start": {}, "end": {}}]}, "18": {"loc": {"start": {"line": 185, "column": 12}, "end": {"line": 185, "column": 58}}, "type": "binary-expr", "locations": [{"start": {"line": 185, "column": 12}, "end": {"line": 185, "column": 32}}, {"start": {"line": 185, "column": 32}, "end": {"line": 185, "column": 58}}]}, "19": {"loc": {"start": {"line": 188, "column": 8}, "end": {"line": 190, "column": null}}, "type": "if", "locations": [{"start": {"line": 188, "column": 8}, "end": {"line": 190, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 19, "3": 16, "4": 174, "5": 58, "6": 2, "7": 56, "8": 56, "9": 2, "10": 54, "11": 0, "12": 54, "13": 54, "14": 54, "15": 54, "16": 23, "17": 23, "18": 23, "19": 23, "20": 29, "21": 29, "22": 0, "23": 29, "24": 1, "25": 1, "26": 28, "27": 1, "28": 27, "29": 27, "30": 26, "31": 23, "32": 23, "33": 23, "34": 23, "35": 25, "36": 25, "37": 2, "38": 21, "39": 23, "40": 23, "41": 23, "42": 23, "43": 23, "44": 23, "45": 23, "46": 24, "47": 23, "48": 24, "49": 23, "50": 23, "51": 23, "52": 33, "53": 2, "54": 31, "55": 30, "56": 23}, "f": {"0": 19, "1": 16, "2": 174, "3": 58, "4": 54, "5": 54, "6": 23, "7": 23, "8": 23, "9": 24, "10": 24, "11": 23}, "b": {"0": [16, 16], "1": [174, 174, 174], "2": [2, 56], "3": [58, 58], "4": [2, 54], "5": [2, 0], "6": [0, 54], "7": [54, 54, 54], "8": [54, 0], "9": [52, 30], "10": [0, 29], "11": [1, 28], "12": [1, 27], "13": [26, 1], "14": [25, 0], "15": [2, 23], "16": [23, 22], "17": [2, 31], "18": [33, 33], "19": [30, 1]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/evidence.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/evidence.ts", "statementMap": {"0": {"start": {"line": 3, "column": 30}, "end": {"line": 3, "column": null}}, "1": {"start": {"line": 4, "column": 27}, "end": {"line": 4, "column": null}}, "2": {"start": {"line": 12, "column": 4}, "end": {"line": 12, "column": null}}, "3": {"start": {"line": 25, "column": 20}, "end": {"line": 25, "column": null}}, "4": {"start": {"line": 26, "column": 20}, "end": {"line": 26, "column": null}}, "5": {"start": {"line": 28, "column": 4}, "end": {"line": 42, "column": null}}, "6": {"start": {"line": 41, "column": 8}, "end": {"line": 41, "column": null}}, "7": {"start": {"line": 44, "column": 25}, "end": {"line": 46, "column": null}}, "8": {"start": {"line": 45, "column": 19}, "end": {"line": 45, "column": null}}, "9": {"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, "10": {"start": {"line": 48, "column": 8}, "end": {"line": 48, "column": null}}, "11": {"start": {"line": 52, "column": 8}, "end": {"line": 52, "column": null}}, "12": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "13": {"start": {"line": 54, "column": 8}, "end": {"line": 54, "column": null}}, "14": {"start": {"line": 57, "column": 4}, "end": {"line": 61, "column": null}}}, "fnMap": {"0": {"name": "isNonBlank", "decl": {"start": {"line": 11, "column": 9}, "end": {"line": 11, "column": 20}}, "loc": {"start": {"line": 11, "column": 53}, "end": {"line": 13, "column": null}}}, "1": {"name": "buildBashJudgmentEvidence", "decl": {"start": {"line": 22, "column": 16}, "end": {"line": 22, "column": null}}, "loc": {"start": {"line": 24, "column": 36}, "end": {"line": 62, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 45, "column": 8}, "end": {"line": 45, "column": 9}}, "loc": {"start": {"line": 45, "column": 19}, "end": {"line": 45, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 12, "column": 11}, "end": {"line": 12, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 12, "column": 11}, "end": {"line": 12, "column": 40}}, {"start": {"line": 12, "column": 40}, "end": {"line": 12, "column": null}}]}, "1": {"loc": {"start": {"line": 28, "column": 4}, "end": {"line": 42, "column": null}}, "type": "if", "locations": [{"start": {"line": 28, "column": 4}, "end": {"line": 42, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 29, "column": 8}, "end": {"line": 39, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 29, "column": 8}, "end": {"line": 29, "column": null}}, {"start": {"line": 30, "column": 8}, "end": {"line": 30, "column": null}}, {"start": {"line": 31, "column": 8}, "end": {"line": 31, "column": null}}, {"start": {"line": 32, "column": 8}, "end": {"line": 32, "column": null}}, {"start": {"line": 33, "column": 8}, "end": {"line": 33, "column": null}}, {"start": {"line": 34, "column": 8}, "end": {"line": 34, "column": null}}, {"start": {"line": 35, "column": 8}, "end": {"line": 35, "column": null}}, {"start": {"line": 36, "column": 8}, "end": {"line": 36, "column": null}}, {"start": {"line": 37, "column": 8}, "end": {"line": 37, "column": null}}, {"start": {"line": 38, "column": 8}, "end": {"line": 38, "column": null}}, {"start": {"line": 39, "column": 9}, "end": {"line": 39, "column": 42}}, {"start": {"line": 39, "column": 42}, "end": {"line": 39, "column": null}}]}, "3": {"loc": {"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, "type": "if", "locations": [{"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 52, "column": 8}, "end": {"line": 52, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 52, "column": 36}, "end": {"line": 52, "column": 52}}, {"start": {"line": 52, "column": 52}, "end": {"line": 52, "column": null}}]}, "5": {"loc": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "type": "if", "locations": [{"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 60, "column": 12}, "end": {"line": 60, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 60, "column": 44}, "end": {"line": 60, "column": 56}}, {"start": {"line": 60, "column": 56}, "end": {"line": 60, "column": null}}]}}, "s": {"0": 2, "1": 2, "2": 48, "3": 28, "4": 28, "5": 28, "6": 4, "7": 24, "8": 24, "9": 24, "10": 1, "11": 23, "12": 23, "13": 1, "14": 22}, "f": {"0": 48, "1": 28, "2": 24}, "b": {"0": [48, 47], "1": [4, 24], "2": [28, 28, 28, 27, 27, 26, 26, 26, 25, 25, 25, 25], "3": [1, 23], "4": [1, 22], "5": [1, 22], "6": [1, 21]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/highrisk.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/highrisk.ts", "statementMap": {"0": {"start": {"line": 44, "column": 24}, "end": {"line": 44, "column": null}}, "1": {"start": {"line": 46, "column": 20}, "end": {"line": 46, "column": null}}, "2": {"start": {"line": 57, "column": 30}, "end": {"line": 57, "column": null}}, "3": {"start": {"line": 58, "column": 27}, "end": {"line": 58, "column": null}}, "4": {"start": {"line": 59, "column": 18}, "end": {"line": 59, "column": null}}, "5": {"start": {"line": 60, "column": 31}, "end": {"line": 60, "column": null}}, "6": {"start": {"line": 62, "column": 22}, "end": {"line": 67, "column": null}}, "7": {"start": {"line": 63, "column": 8}, "end": {"line": 66, "column": null}}, "8": {"start": {"line": 64, "column": 12}, "end": {"line": 64, "column": null}}, "9": {"start": {"line": 65, "column": 12}, "end": {"line": 65, "column": null}}, "10": {"start": {"line": 68, "column": 21}, "end": {"line": 74, "column": null}}, "11": {"start": {"line": 69, "column": 8}, "end": {"line": 69, "column": null}}, "12": {"start": {"line": 70, "column": 8}, "end": {"line": 73, "column": null}}, "13": {"start": {"line": 71, "column": 12}, "end": {"line": 71, "column": null}}, "14": {"start": {"line": 72, "column": 12}, "end": {"line": 72, "column": null}}, "15": {"start": {"line": 76, "column": 4}, "end": {"line": 116, "column": null}}, "16": {"start": {"line": 76, "column": 17}, "end": {"line": 76, "column": 20}}, "17": {"start": {"line": 77, "column": 19}, "end": {"line": 77, "column": null}}, "18": {"start": {"line": 78, "column": 8}, "end": {"line": 85, "column": null}}, "19": {"start": {"line": 79, "column": 12}, "end": {"line": 83, "column": null}}, "20": {"start": {"line": 80, "column": 16}, "end": {"line": 80, "column": null}}, "21": {"start": {"line": 82, "column": 16}, "end": {"line": 82, "column": null}}, "22": {"start": {"line": 84, "column": 12}, "end": {"line": 84, "column": null}}, "23": {"start": {"line": 86, "column": 8}, "end": {"line": 90, "column": null}}, "24": {"start": {"line": 87, "column": 12}, "end": {"line": 87, "column": null}}, "25": {"start": {"line": 88, "column": 12}, "end": {"line": 88, "column": null}}, "26": {"start": {"line": 89, "column": 12}, "end": {"line": 89, "column": null}}, "27": {"start": {"line": 91, "column": 8}, "end": {"line": 95, "column": null}}, "28": {"start": {"line": 92, "column": 12}, "end": {"line": 92, "column": null}}, "29": {"start": {"line": 93, "column": 12}, "end": {"line": 93, "column": null}}, "30": {"start": {"line": 94, "column": 12}, "end": {"line": 94, "column": null}}, "31": {"start": {"line": 96, "column": 8}, "end": {"line": 99, "column": null}}, "32": {"start": {"line": 97, "column": 12}, "end": {"line": 97, "column": null}}, "33": {"start": {"line": 98, "column": 12}, "end": {"line": 98, "column": null}}, "34": {"start": {"line": 100, "column": 8}, "end": {"line": 110, "column": null}}, "35": {"start": {"line": 101, "column": 23}, "end": {"line": 101, "column": null}}, "36": {"start": {"line": 102, "column": 12}, "end": {"line": 102, "column": null}}, "37": {"start": {"line": 103, "column": 21}, "end": {"line": 103, "column": null}}, "38": {"start": {"line": 104, "column": 12}, "end": {"line": 107, "column": null}}, "39": {"start": {"line": 105, "column": 16}, "end": {"line": 105, "column": null}}, "40": {"start": {"line": 106, "column": 16}, "end": {"line": 106, "column": null}}, "41": {"start": {"line": 108, "column": 12}, "end": {"line": 108, "column": null}}, "42": {"start": {"line": 109, "column": 12}, "end": {"line": 109, "column": null}}, "43": {"start": {"line": 111, "column": 8}, "end": {"line": 114, "column": null}}, "44": {"start": {"line": 112, "column": 12}, "end": {"line": 112, "column": null}}, "45": {"start": {"line": 113, "column": 12}, "end": {"line": 113, "column": null}}, "46": {"start": {"line": 115, "column": 8}, "end": {"line": 115, "column": null}}, "47": {"start": {"line": 117, "column": 4}, "end": {"line": 117, "column": null}}, "48": {"start": {"line": 118, "column": 4}, "end": {"line": 118, "column": null}}, "49": {"start": {"line": 123, "column": 20}, "end": {"line": 123, "column": null}}, "50": {"start": {"line": 124, "column": 4}, "end": {"line": 126, "column": null}}, "51": {"start": {"line": 125, "column": 8}, "end": {"line": 125, "column": null}}, "52": {"start": {"line": 127, "column": 4}, "end": {"line": 129, "column": null}}, "53": {"start": {"line": 128, "column": 8}, "end": {"line": 128, "column": null}}, "54": {"start": {"line": 130, "column": 4}, "end": {"line": 130, "column": null}}, "55": {"start": {"line": 134, "column": 4}, "end": {"line": 141, "column": null}}, "56": {"start": {"line": 135, "column": 8}, "end": {"line": 137, "column": null}}, "57": {"start": {"line": 136, "column": 12}, "end": {"line": 136, "column": null}}, "58": {"start": {"line": 138, "column": 8}, "end": {"line": 140, "column": null}}, "59": {"start": {"line": 139, "column": 12}, "end": {"line": 139, "column": null}}, "60": {"start": {"line": 142, "column": 4}, "end": {"line": 142, "column": null}}, "61": {"start": {"line": 146, "column": 23}, "end": {"line": 146, "column": null}}, "62": {"start": {"line": 147, "column": 17}, "end": {"line": 147, "column": null}}, "63": {"start": {"line": 148, "column": 4}, "end": {"line": 192, "column": null}}, "64": {"start": {"line": 152, "column": 30}, "end": {"line": 152, "column": null}}, "65": {"start": {"line": 152, "column": 49}, "end": {"line": 152, "column": 95}}, "66": {"start": {"line": 153, "column": 26}, "end": {"line": 153, "column": null}}, "67": {"start": {"line": 154, "column": 28}, "end": {"line": 154, "column": null}}, "68": {"start": {"line": 155, "column": 12}, "end": {"line": 157, "column": null}}, "69": {"start": {"line": 156, "column": 16}, "end": {"line": 156, "column": null}}, "70": {"start": {"line": 158, "column": 12}, "end": {"line": 158, "column": null}}, "71": {"start": {"line": 161, "column": 12}, "end": {"line": 163, "column": null}}, "72": {"start": {"line": 162, "column": 16}, "end": {"line": 162, "column": null}}, "73": {"start": {"line": 164, "column": 12}, "end": {"line": 164, "column": null}}, "74": {"start": {"line": 169, "column": 31}, "end": {"line": 169, "column": null}}, "75": {"start": {"line": 169, "column": 52}, "end": {"line": 169, "column": 72}}, "76": {"start": {"line": 170, "column": 29}, "end": {"line": 170, "column": null}}, "77": {"start": {"line": 171, "column": 12}, "end": {"line": 176, "column": null}}, "78": {"start": {"line": 171, "column": 77}, "end": {"line": 171, "column": 88}}, "79": {"start": {"line": 172, "column": 16}, "end": {"line": 175, "column": null}}, "80": {"start": {"line": 177, "column": 12}, "end": {"line": 177, "column": null}}, "81": {"start": {"line": 181, "column": 16}, "end": {"line": 184, "column": null}}, "82": {"start": {"line": 184, "column": 35}, "end": {"line": 184, "column": 72}}, "83": {"start": {"line": 185, "column": 12}, "end": {"line": 187, "column": null}}, "84": {"start": {"line": 186, "column": 16}, "end": {"line": 186, "column": null}}, "85": {"start": {"line": 188, "column": 12}, "end": {"line": 188, "column": null}}, "86": {"start": {"line": 191, "column": 12}, "end": {"line": 191, "column": null}}, "87": {"start": {"line": 196, "column": 22}, "end": {"line": 196, "column": null}}, "88": {"start": {"line": 196, "column": 41}, "end": {"line": 196, "column": 135}}, "89": {"start": {"line": 197, "column": 19}, "end": {"line": 197, "column": null}}, "90": {"start": {"line": 198, "column": 4}, "end": {"line": 200, "column": null}}, "91": {"start": {"line": 199, "column": 8}, "end": {"line": 199, "column": null}}, "92": {"start": {"line": 201, "column": 20}, "end": {"line": 201, "column": null}}, "93": {"start": {"line": 201, "column": 41}, "end": {"line": 201, "column": 87}}, "94": {"start": {"line": 202, "column": 22}, "end": {"line": 211, "column": null}}, "95": {"start": {"line": 204, "column": 12}, "end": {"line": 210, "column": null}}, "96": {"start": {"line": 212, "column": 4}, "end": {"line": 214, "column": null}}, "97": {"start": {"line": 218, "column": 16}, "end": {"line": 218, "column": null}}, "98": {"start": {"line": 219, "column": 4}, "end": {"line": 235, "column": null}}, "99": {"start": {"line": 224, "column": 12}, "end": {"line": 226, "column": null}}, "100": {"start": {"line": 225, "column": 16}, "end": {"line": 225, "column": null}}, "101": {"start": {"line": 227, "column": 12}, "end": {"line": 227, "column": null}}, "102": {"start": {"line": 229, "column": 12}, "end": {"line": 231, "column": null}}, "103": {"start": {"line": 230, "column": 16}, "end": {"line": 230, "column": null}}, "104": {"start": {"line": 232, "column": 12}, "end": {"line": 232, "column": null}}, "105": {"start": {"line": 234, "column": 12}, "end": {"line": 234, "column": null}}, "106": {"start": {"line": 239, "column": 4}, "end": {"line": 241, "column": null}}, "107": {"start": {"line": 240, "column": 8}, "end": {"line": 240, "column": null}}, "108": {"start": {"line": 242, "column": 4}, "end": {"line": 244, "column": null}}, "109": {"start": {"line": 243, "column": 8}, "end": {"line": 243, "column": null}}, "110": {"start": {"line": 245, "column": 4}, "end": {"line": 247, "column": null}}, "111": {"start": {"line": 246, "column": 8}, "end": {"line": 246, "column": null}}, "112": {"start": {"line": 248, "column": 4}, "end": {"line": 252, "column": null}}, "113": {"start": {"line": 249, "column": 8}, "end": {"line": 251, "column": null}}, "114": {"start": {"line": 249, "column": 31}, "end": {"line": 249, "column": 54}}, "115": {"start": {"line": 250, "column": 12}, "end": {"line": 250, "column": null}}, "116": {"start": {"line": 253, "column": 4}, "end": {"line": 253, "column": null}}, "117": {"start": {"line": 257, "column": 25}, "end": {"line": 272, "column": null}}, "118": {"start": {"line": 274, "column": 83}, "end": {"line": 289, "column": null}}, "119": {"start": {"line": 294, "column": 4}, "end": {"line": 298, "column": null}}, "120": {"start": {"line": 295, "column": 8}, "end": {"line": 297, "column": null}}, "121": {"start": {"line": 296, "column": 12}, "end": {"line": 296, "column": null}}, "122": {"start": {"line": 299, "column": 4}, "end": {"line": 299, "column": null}}, "123": {"start": {"line": 303, "column": 4}, "end": {"line": 311, "column": null}}, "124": {"start": {"line": 304, "column": 8}, "end": {"line": 306, "column": null}}, "125": {"start": {"line": 305, "column": 12}, "end": {"line": 305, "column": null}}, "126": {"start": {"line": 307, "column": 22}, "end": {"line": 307, "column": null}}, "127": {"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, "128": {"start": {"line": 309, "column": 12}, "end": {"line": 309, "column": null}}, "129": {"start": {"line": 312, "column": 4}, "end": {"line": 312, "column": null}}, "130": {"start": {"line": 322, "column": 4}, "end": {"line": 337, "column": null}}, "131": {"start": {"line": 322, "column": 17}, "end": {"line": 322, "column": 20}}, "132": {"start": {"line": 323, "column": 8}, "end": {"line": 325, "column": null}}, "133": {"start": {"line": 324, "column": 12}, "end": {"line": 324, "column": null}}, "134": {"start": {"line": 326, "column": 23}, "end": {"line": 326, "column": null}}, "135": {"start": {"line": 327, "column": 8}, "end": {"line": 329, "column": null}}, "136": {"start": {"line": 328, "column": 12}, "end": {"line": 328, "column": null}}, "137": {"start": {"line": 330, "column": 22}, "end": {"line": 330, "column": null}}, "138": {"start": {"line": 331, "column": 8}, "end": {"line": 336, "column": null}}, "139": {"start": {"line": 332, "column": 12}, "end": {"line": 335, "column": null}}, "140": {"start": {"line": 338, "column": 4}, "end": {"line": 338, "column": null}}, "141": {"start": {"line": 346, "column": 4}, "end": {"line": 358, "column": null}}, "142": {"start": {"line": 347, "column": 32}, "end": {"line": 347, "column": null}}, "143": {"start": {"line": 349, "column": 12}, "end": {"line": 354, "column": null}}, "144": {"start": {"line": 355, "column": 8}, "end": {"line": 357, "column": null}}, "145": {"start": {"line": 356, "column": 12}, "end": {"line": 356, "column": null}}, "146": {"start": {"line": 359, "column": 4}, "end": {"line": 359, "column": null}}}, "fnMap": {"0": {"name": "scanCommand", "decl": {"start": {"line": 56, "column": 9}, "end": {"line": 56, "column": 21}}, "loc": {"start": {"line": 56, "column": 50}, "end": {"line": 119, "column": null}}}, "1": {"name": "(anonymous_1)", "decl": {"start": {"line": 62, "column": 22}, "end": {"line": 62, "column": 34}}, "loc": {"start": {"line": 62, "column": 34}, "end": {"line": 67, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 68, "column": 21}, "end": {"line": 68, "column": 33}}, "loc": {"start": {"line": 68, "column": 33}, "end": {"line": 74, "column": null}}}, "3": {"name": "shortFlagLetters", "decl": {"start": {"line": 122, "column": 9}, "end": {"line": 122, "column": 26}}, "loc": {"start": {"line": 122, "column": 54}, "end": {"line": 131, "column": null}}}, "4": {"name": "hasGitFlag", "decl": {"start": {"line": 133, "column": 9}, "end": {"line": 133, "column": 20}}, "loc": {"start": {"line": 133, "column": 75}, "end": {"line": 143, "column": null}}}, "5": {"name": "classifyGit", "decl": {"start": {"line": 145, "column": 9}, "end": {"line": 145, "column": 21}}, "loc": {"start": {"line": 145, "column": 64}, "end": {"line": 193, "column": null}}}, "6": {"name": "(anonymous_6)", "decl": {"start": {"line": 152, "column": 40}, "end": {"line": 152, "column": 41}}, "loc": {"start": {"line": 152, "column": 49}, "end": {"line": 152, "column": 95}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 169, "column": 43}, "end": {"line": 169, "column": 44}}, "loc": {"start": {"line": 169, "column": 52}, "end": {"line": 169, "column": 72}}}, "8": {"name": "(anonymous_8)", "decl": {"start": {"line": 171, "column": 68}, "end": {"line": 171, "column": 69}}, "loc": {"start": {"line": 171, "column": 77}, "end": {"line": 171, "column": 88}}}, "9": {"name": "(anonymous_9)", "decl": {"start": {"line": 184, "column": 26}, "end": {"line": 184, "column": 27}}, "loc": {"start": {"line": 184, "column": 35}, "end": {"line": 184, "column": 72}}}, "10": {"name": "classifyRm", "decl": {"start": {"line": 195, "column": 9}, "end": {"line": 195, "column": 20}}, "loc": {"start": {"line": 195, "column": 63}, "end": {"line": 215, "column": null}}}, "11": {"name": "(anonymous_11)", "decl": {"start": {"line": 196, "column": 32}, "end": {"line": 196, "column": 33}}, "loc": {"start": {"line": 196, "column": 41}, "end": {"line": 196, "column": 135}}}, "12": {"name": "(anonymous_12)", "decl": {"start": {"line": 201, "column": 32}, "end": {"line": 201, "column": 33}}, "loc": {"start": {"line": 201, "column": 41}, "end": {"line": 201, "column": 87}}}, "13": {"name": "(anonymous_13)", "decl": {"start": {"line": 203, "column": 8}, "end": {"line": 203, "column": 9}}, "loc": {"start": {"line": 204, "column": 12}, "end": {"line": 210, "column": null}}}, "14": {"name": "classifyPublish", "decl": {"start": {"line": 217, "column": 9}, "end": {"line": 217, "column": 25}}, "loc": {"start": {"line": 217, "column": 82}, "end": {"line": 236, "column": null}}}, "15": {"name": "classifySystem", "decl": {"start": {"line": 238, "column": 9}, "end": {"line": 238, "column": 24}}, "loc": {"start": {"line": 238, "column": 81}, "end": {"line": 254, "column": null}}}, "16": {"name": "(anonymous_16)", "decl": {"start": {"line": 249, "column": 22}, "end": {"line": 249, "column": 23}}, "loc": {"start": {"line": 249, "column": 31}, "end": {"line": 249, "column": 54}}}, "17": {"name": "matchCredentialPath", "decl": {"start": {"line": 291, "column": 9}, "end": {"line": 291, "column": null}}, "loc": {"start": {"line": 293, "column": 32}, "end": {"line": 300, "column": null}}}, "18": {"name": "classifyCredential", "decl": {"start": {"line": 302, "column": 9}, "end": {"line": 302, "column": 28}}, "loc": {"start": {"line": 302, "column": 71}, "end": {"line": 313, "column": null}}}, "19": {"name": "classifyCredentialRedirect", "decl": {"start": {"line": 321, "column": 9}, "end": {"line": 321, "column": 36}}, "loc": {"start": {"line": 321, "column": 81}, "end": {"line": 339, "column": null}}}, "20": {"name": "classifyHighRisk", "decl": {"start": {"line": 345, "column": 16}, "end": {"line": 345, "column": 33}}, "loc": {"start": {"line": 345, "column": 81}, "end": {"line": 360, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 63, "column": 8}, "end": {"line": 66, "column": null}}, "type": "if", "locations": [{"start": {"line": 63, "column": 8}, "end": {"line": 66, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 70, "column": 8}, "end": {"line": 73, "column": null}}, "type": "if", "locations": [{"start": {"line": 70, "column": 8}, "end": {"line": 73, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 78, "column": 8}, "end": {"line": 85, "column": null}}, "type": "if", "locations": [{"start": {"line": 78, "column": 8}, "end": {"line": 85, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 79, "column": 12}, "end": {"line": 83, "column": null}}, "type": "if", "locations": [{"start": {"line": 79, "column": 12}, "end": {"line": 83, "column": null}}, {"start": {"line": 81, "column": 19}, "end": {"line": 83, "column": null}}]}, "4": {"loc": {"start": {"line": 86, "column": 8}, "end": {"line": 90, "column": null}}, "type": "if", "locations": [{"start": {"line": 86, "column": 8}, "end": {"line": 90, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 86, "column": 12}, "end": {"line": 86, "column": 38}}, "type": "binary-expr", "locations": [{"start": {"line": 86, "column": 12}, "end": {"line": 86, "column": 26}}, {"start": {"line": 86, "column": 26}, "end": {"line": 86, "column": 38}}]}, "6": {"loc": {"start": {"line": 91, "column": 8}, "end": {"line": 95, "column": null}}, "type": "if", "locations": [{"start": {"line": 91, "column": 8}, "end": {"line": 95, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 92, "column": 23}, "end": {"line": 92, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 92, "column": 23}, "end": {"line": 92, "column": 41}}, {"start": {"line": 92, "column": 41}, "end": {"line": 92, "column": null}}]}, "8": {"loc": {"start": {"line": 96, "column": 8}, "end": {"line": 99, "column": null}}, "type": "if", "locations": [{"start": {"line": 96, "column": 8}, "end": {"line": 99, "column": null}}, {"start": {}, "end": {}}]}, "9": {"loc": {"start": {"line": 100, "column": 8}, "end": {"line": 110, "column": null}}, "type": "if", "locations": [{"start": {"line": 100, "column": 8}, "end": {"line": 110, "column": null}}, {"start": {}, "end": {}}]}, "10": {"loc": {"start": {"line": 103, "column": 21}, "end": {"line": 103, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 103, "column": 35}, "end": {"line": 103, "column": 41}}, {"start": {"line": 103, "column": 41}, "end": {"line": 103, "column": null}}]}, "11": {"loc": {"start": {"line": 104, "column": 12}, "end": {"line": 107, "column": null}}, "type": "if", "locations": [{"start": {"line": 104, "column": 12}, "end": {"line": 107, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 111, "column": 8}, "end": {"line": 114, "column": null}}, "type": "if", "locations": [{"start": {"line": 111, "column": 8}, "end": {"line": 114, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 124, "column": 4}, "end": {"line": 126, "column": null}}, "type": "if", "locations": [{"start": {"line": 124, "column": 4}, "end": {"line": 126, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 135, "column": 8}, "end": {"line": 137, "column": null}}, "type": "if", "locations": [{"start": {"line": 135, "column": 8}, "end": {"line": 137, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 138, "column": 8}, "end": {"line": 140, "column": null}}, "type": "if", "locations": [{"start": {"line": 138, "column": 8}, "end": {"line": 140, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 148, "column": 4}, "end": {"line": 192, "column": null}}, "type": "switch", "locations": [{"start": {"line": 149, "column": 8}, "end": {"line": 159, "column": null}}, {"start": {"line": 160, "column": 8}, "end": {"line": 164, "column": null}}, {"start": {"line": 165, "column": 8}, "end": {"line": 165, "column": null}}, {"start": {"line": 166, "column": 8}, "end": {"line": 178, "column": null}}, {"start": {"line": 179, "column": 8}, "end": {"line": 189, "column": null}}, {"start": {"line": 190, "column": 8}, "end": {"line": 191, "column": null}}]}, "17": {"loc": {"start": {"line": 152, "column": 49}, "end": {"line": 152, "column": 95}}, "type": "binary-expr", "locations": [{"start": {"line": 152, "column": 49}, "end": {"line": 152, "column": 65}}, {"start": {"line": 152, "column": 65}, "end": {"line": 152, "column": 95}}]}, "18": {"loc": {"start": {"line": 154, "column": 28}, "end": {"line": 154, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 154, "column": 28}, "end": {"line": 154, "column": 58}}, {"start": {"line": 154, "column": 58}, "end": {"line": 154, "column": null}}]}, "19": {"loc": {"start": {"line": 155, "column": 12}, "end": {"line": 157, "column": null}}, "type": "if", "locations": [{"start": {"line": 155, "column": 12}, "end": {"line": 157, "column": null}}, {"start": {}, "end": {}}]}, "20": {"loc": {"start": {"line": 155, "column": 16}, "end": {"line": 155, "column": 48}}, "type": "binary-expr", "locations": [{"start": {"line": 155, "column": 16}, "end": {"line": 155, "column": 25}}, {"start": {"line": 155, "column": 25}, "end": {"line": 155, "column": 36}}, {"start": {"line": 155, "column": 36}, "end": {"line": 155, "column": 48}}]}, "21": {"loc": {"start": {"line": 161, "column": 12}, "end": {"line": 163, "column": null}}, "type": "if", "locations": [{"start": {"line": 161, "column": 12}, "end": {"line": 163, "column": null}}, {"start": {}, "end": {}}]}, "22": {"loc": {"start": {"line": 171, "column": 12}, "end": {"line": 176, "column": null}}, "type": "if", "locations": [{"start": {"line": 171, "column": 12}, "end": {"line": 176, "column": null}}, {"start": {}, "end": {}}]}, "23": {"loc": {"start": {"line": 171, "column": 16}, "end": {"line": 171, "column": 91}}, "type": "binary-expr", "locations": [{"start": {"line": 171, "column": 16}, "end": {"line": 171, "column": 35}}, {"start": {"line": 171, "column": 35}, "end": {"line": 171, "column": 91}}]}, "24": {"loc": {"start": {"line": 174, "column": 26}, "end": {"line": 174, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 174, "column": 54}, "end": {"line": 174, "column": 75}}, {"start": {"line": 174, "column": 75}, "end": {"line": 174, "column": null}}]}, "25": {"loc": {"start": {"line": 181, "column": 16}, "end": {"line": 184, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 181, "column": 16}, "end": {"line": 181, "column": null}}, {"start": {"line": 182, "column": 16}, "end": {"line": 182, "column": null}}, {"start": {"line": 183, "column": 16}, "end": {"line": 183, "column": null}}, {"start": {"line": 184, "column": 16}, "end": {"line": 184, "column": null}}]}, "26": {"loc": {"start": {"line": 184, "column": 35}, "end": {"line": 184, "column": 72}}, "type": "binary-expr", "locations": [{"start": {"line": 184, "column": 35}, "end": {"line": 184, "column": 58}}, {"start": {"line": 184, "column": 58}, "end": {"line": 184, "column": 72}}]}, "27": {"loc": {"start": {"line": 185, "column": 12}, "end": {"line": 187, "column": null}}, "type": "if", "locations": [{"start": {"line": 185, "column": 12}, "end": {"line": 187, "column": null}}, {"start": {}, "end": {}}]}, "28": {"loc": {"start": {"line": 196, "column": 41}, "end": {"line": 196, "column": 135}}, "type": "binary-expr", "locations": [{"start": {"line": 196, "column": 41}, "end": {"line": 196, "column": 82}}, {"start": {"line": 196, "column": 82}, "end": {"line": 196, "column": 98}}, {"start": {"line": 196, "column": 98}, "end": {"line": 196, "column": 114}}, {"start": {"line": 196, "column": 114}, "end": {"line": 196, "column": 135}}]}, "29": {"loc": {"start": {"line": 198, "column": 4}, "end": {"line": 200, "column": null}}, "type": "if", "locations": [{"start": {"line": 198, "column": 4}, "end": {"line": 200, "column": null}}, {"start": {}, "end": {}}]}, "30": {"loc": {"start": {"line": 198, "column": 8}, "end": {"line": 198, "column": 31}}, "type": "binary-expr", "locations": [{"start": {"line": 198, "column": 8}, "end": {"line": 198, "column": 22}}, {"start": {"line": 198, "column": 22}, "end": {"line": 198, "column": 31}}]}, "31": {"loc": {"start": {"line": 201, "column": 41}, "end": {"line": 201, "column": 87}}, "type": "binary-expr", "locations": [{"start": {"line": 201, "column": 41}, "end": {"line": 201, "column": 65}}, {"start": {"line": 201, "column": 65}, "end": {"line": 201, "column": 87}}]}, "32": {"loc": {"start": {"line": 204, "column": 12}, "end": {"line": 210, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 204, "column": 12}, "end": {"line": 204, "column": null}}, {"start": {"line": 205, "column": 12}, "end": {"line": 205, "column": null}}, {"start": {"line": 206, "column": 12}, "end": {"line": 206, "column": null}}, {"start": {"line": 207, "column": 12}, "end": {"line": 207, "column": null}}, {"start": {"line": 208, "column": 12}, "end": {"line": 208, "column": null}}, {"start": {"line": 209, "column": 12}, "end": {"line": 209, "column": null}}, {"start": {"line": 210, "column": 12}, "end": {"line": 210, "column": null}}]}, "33": {"loc": {"start": {"line": 212, "column": 11}, "end": {"line": 214, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 213, "column": 10}, "end": {"line": 213, "column": null}}, {"start": {"line": 214, "column": 10}, "end": {"line": 214, "column": null}}]}, "34": {"loc": {"start": {"line": 219, "column": 4}, "end": {"line": 235, "column": null}}, "type": "switch", "locations": [{"start": {"line": 220, "column": 8}, "end": {"line": 220, "column": null}}, {"start": {"line": 221, "column": 8}, "end": {"line": 221, "column": null}}, {"start": {"line": 222, "column": 8}, "end": {"line": 222, "column": null}}, {"start": {"line": 223, "column": 8}, "end": {"line": 227, "column": null}}, {"start": {"line": 228, "column": 8}, "end": {"line": 232, "column": null}}, {"start": {"line": 233, "column": 8}, "end": {"line": 234, "column": null}}]}, "35": {"loc": {"start": {"line": 224, "column": 12}, "end": {"line": 226, "column": null}}, "type": "if", "locations": [{"start": {"line": 224, "column": 12}, "end": {"line": 226, "column": null}}, {"start": {}, "end": {}}]}, "36": {"loc": {"start": {"line": 229, "column": 12}, "end": {"line": 231, "column": null}}, "type": "if", "locations": [{"start": {"line": 229, "column": 12}, "end": {"line": 231, "column": null}}, {"start": {}, "end": {}}]}, "37": {"loc": {"start": {"line": 239, "column": 4}, "end": {"line": 241, "column": null}}, "type": "if", "locations": [{"start": {"line": 239, "column": 4}, "end": {"line": 241, "column": null}}, {"start": {}, "end": {}}]}, "38": {"loc": {"start": {"line": 242, "column": 4}, "end": {"line": 244, "column": null}}, "type": "if", "locations": [{"start": {"line": 242, "column": 4}, "end": {"line": 244, "column": null}}, {"start": {}, "end": {}}]}, "39": {"loc": {"start": {"line": 245, "column": 4}, "end": {"line": 247, "column": null}}, "type": "if", "locations": [{"start": {"line": 245, "column": 4}, "end": {"line": 247, "column": null}}, {"start": {}, "end": {}}]}, "40": {"loc": {"start": {"line": 245, "column": 8}, "end": {"line": 245, "column": 92}}, "type": "binary-expr", "locations": [{"start": {"line": 245, "column": 8}, "end": {"line": 245, "column": 31}}, {"start": {"line": 245, "column": 31}, "end": {"line": 245, "column": 52}}, {"start": {"line": 245, "column": 52}, "end": {"line": 245, "column": 71}}, {"start": {"line": 245, "column": 71}, "end": {"line": 245, "column": 92}}]}, "41": {"loc": {"start": {"line": 248, "column": 4}, "end": {"line": 252, "column": null}}, "type": "if", "locations": [{"start": {"line": 248, "column": 4}, "end": {"line": 252, "column": null}}, {"start": {}, "end": {}}]}, "42": {"loc": {"start": {"line": 249, "column": 8}, "end": {"line": 251, "column": null}}, "type": "if", "locations": [{"start": {"line": 249, "column": 8}, "end": {"line": 251, "column": null}}, {"start": {}, "end": {}}]}, "43": {"loc": {"start": {"line": 295, "column": 8}, "end": {"line": 297, "column": null}}, "type": "if", "locations": [{"start": {"line": 295, "column": 8}, "end": {"line": 297, "column": null}}, {"start": {}, "end": {}}]}, "44": {"loc": {"start": {"line": 304, "column": 8}, "end": {"line": 306, "column": null}}, "type": "if", "locations": [{"start": {"line": 304, "column": 8}, "end": {"line": 306, "column": null}}, {"start": {}, "end": {}}]}, "45": {"loc": {"start": {"line": 304, "column": 12}, "end": {"line": 304, "column": 58}}, "type": "binary-expr", "locations": [{"start": {"line": 304, "column": 12}, "end": {"line": 304, "column": 35}}, {"start": {"line": 304, "column": 35}, "end": {"line": 304, "column": 58}}]}, "46": {"loc": {"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, "type": "if", "locations": [{"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, {"start": {}, "end": {}}]}, "47": {"loc": {"start": {"line": 323, "column": 8}, "end": {"line": 325, "column": null}}, "type": "if", "locations": [{"start": {"line": 323, "column": 8}, "end": {"line": 325, "column": null}}, {"start": {}, "end": {}}]}, "48": {"loc": {"start": {"line": 327, "column": 8}, "end": {"line": 329, "column": null}}, "type": "if", "locations": [{"start": {"line": 327, "column": 8}, "end": {"line": 329, "column": null}}, {"start": {}, "end": {}}]}, "49": {"loc": {"start": {"line": 331, "column": 8}, "end": {"line": 336, "column": null}}, "type": "if", "locations": [{"start": {"line": 331, "column": 8}, "end": {"line": 336, "column": null}}, {"start": {}, "end": {}}]}, "50": {"loc": {"start": {"line": 349, "column": 12}, "end": {"line": 354, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 349, "column": 12}, "end": {"line": 349, "column": null}}, {"start": {"line": 350, "column": 13}, "end": {"line": 350, "column": null}}, {"start": {"line": 351, "column": 12}, "end": {"line": 351, "column": null}}, {"start": {"line": 352, "column": 13}, "end": {"line": 352, "column": null}}, {"start": {"line": 353, "column": 13}, "end": {"line": 353, "column": null}}, {"start": {"line": 354, "column": 12}, "end": {"line": 354, "column": null}}]}, "51": {"loc": {"start": {"line": 350, "column": 13}, "end": {"line": 350, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 350, "column": 42}, "end": {"line": 350, "column": 69}}, {"start": {"line": 350, "column": 69}, "end": {"line": 350, "column": null}}]}, "52": {"loc": {"start": {"line": 352, "column": 13}, "end": {"line": 352, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 352, "column": 30}, "end": {"line": 352, "column": 50}}, {"start": {"line": 352, "column": 50}, "end": {"line": 352, "column": null}}]}, "53": {"loc": {"start": {"line": 353, "column": 13}, "end": {"line": 353, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 353, "column": 29}, "end": {"line": 353, "column": 48}}, {"start": {"line": 353, "column": 48}, "end": {"line": 353, "column": null}}]}, "54": {"loc": {"start": {"line": 355, "column": 8}, "end": {"line": 357, "column": null}}, "type": "if", "locations": [{"start": {"line": 355, "column": 8}, "end": {"line": 357, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 128, "3": 128, "4": 128, "5": 128, "6": 128, "7": 544, "8": 444, "9": 444, "10": 128, "11": 183, "12": 183, "13": 160, "14": 160, "15": 128, "16": 128, "17": 2662, "18": 2662, "19": 68, "20": 6, "21": 62, "22": 68, "23": 2594, "24": 6, "25": 6, "26": 6, "27": 2588, "28": 2, "29": 2, "30": 2, "31": 2586, "32": 55, "33": 55, "34": 2531, "35": 5, "36": 5, "37": 5, "38": 5, "39": 1, "40": 1, "41": 5, "42": 5, "43": 2526, "44": 350, "45": 350, "46": 2176, "47": 128, "48": 128, "49": 66, "50": 66, "51": 4, "52": 62, "53": 145, "54": 62, "55": 43, "56": 47, "57": 1, "58": 46, "59": 35, "60": 7, "61": 57, "62": 57, "63": 57, "64": 16, "65": 21, "66": 16, "67": 16, "68": 16, "69": 10, "70": 6, "71": 4, "72": 3, "73": 1, "74": 8, "75": 12, "76": 8, "77": 8, "78": 6, "79": 4, "80": 4, "81": 27, "82": 39, "83": 27, "84": 7, "85": 20, "86": 2, "87": 11, "88": 11, "89": 11, "90": 11, "91": 2, "92": 9, "93": 18, "94": 9, "95": 9, "96": 9, "97": 100, "98": 100, "99": 33, "100": 7, "101": 26, "102": 4, "103": 2, "104": 2, "105": 63, "106": 142, "107": 3, "108": 139, "109": 2, "110": 137, "111": 5, "112": 132, "113": 2, "114": 6, "115": 1, "116": 131, "117": 2, "118": 2, "119": 35, "120": 262, "121": 16, "122": 19, "123": 30, "124": 40, "125": 10, "126": 30, "127": 30, "128": 12, "129": 18, "130": 158, "131": 158, "132": 441, "133": 436, "134": 5, "135": 5, "136": 0, "137": 5, "138": 5, "139": 4, "140": 154, "141": 128, "142": 158, "143": 158, "144": 158, "145": 67, "146": 61}, "f": {"0": 128, "1": 544, "2": 183, "3": 66, "4": 43, "5": 57, "6": 21, "7": 12, "8": 6, "9": 39, "10": 11, "11": 11, "12": 18, "13": 9, "14": 100, "15": 142, "16": 6, "17": 35, "18": 30, "19": 158, "20": 128}, "b": {"0": [444, 100], "1": [160, 23], "2": [68, 2594], "3": [6, 62], "4": [6, 2588], "5": [2594, 2593], "6": [2, 2586], "7": [2, 0], "8": [55, 2531], "9": [5, 2526], "10": [4, 1], "11": [1, 4], "12": [350, 2176], "13": [4, 62], "14": [1, 46], "15": [35, 11], "16": [16, 4, 5, 8, 27, 2], "17": [21, 20], "18": [16, 2], "19": [10, 6], "20": [16, 13, 12], "21": [3, 1], "22": [4, 4], "23": [8, 5], "24": [2, 2], "25": [27, 23, 22, 21], "26": [39, 1], "27": [7, 20], "28": [11, 1, 1, 1], "29": [2, 9], "30": [11, 10], "31": [18, 9], "32": [9, 8, 5, 4, 4, 3, 3], "33": [7, 2], "34": [6, 31, 32, 33, 4, 63], "35": [7, 26], "36": [2, 2], "37": [3, 139], "38": [2, 137], "39": [5, 132], "40": [137, 135, 134, 133], "41": [2, 130], "42": [1, 1], "43": [16, 246], "44": [10, 30], "45": [40, 30], "46": [12, 18], "47": [436, 5], "48": [0, 5], "49": [4, 1], "50": [158, 154, 142, 131, 107, 100], "51": [30, 124], "52": [57, 74], "53": [11, 96], "54": [67, 91]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/index.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/index.ts", "statementMap": {"0": {"start": {"line": 40, "column": 18}, "end": {"line": 40, "column": null}}, "1": {"start": {"line": 41, "column": 30}, "end": {"line": 41, "column": null}}, "2": {"start": {"line": 65, "column": 49}, "end": {"line": 70, "column": null}}, "3": {"start": {"line": 73, "column": 4}, "end": {"line": 73, "column": null}}, "4": {"start": {"line": 90, "column": 4}, "end": {"line": 100, "column": null}}, "5": {"start": {"line": 113, "column": 4}, "end": {"line": 127, "column": null}}, "6": {"start": {"line": 132, "column": 4}, "end": {"line": 146, "column": null}}, "7": {"start": {"line": 133, "column": 27}, "end": {"line": 138, "column": null}}, "8": {"start": {"line": 139, "column": 23}, "end": {"line": 139, "column": null}}, "9": {"start": {"line": 143, "column": 8}, "end": {"line": 143, "column": null}}, "10": {"start": {"line": 145, "column": 8}, "end": {"line": 145, "column": null}}, "11": {"start": {"line": 163, "column": 4}, "end": {"line": 165, "column": null}}, "12": {"start": {"line": 164, "column": 8}, "end": {"line": 164, "column": null}}, "13": {"start": {"line": 166, "column": 18}, "end": {"line": 166, "column": null}}, "14": {"start": {"line": 167, "column": 4}, "end": {"line": 169, "column": null}}, "15": {"start": {"line": 168, "column": 8}, "end": {"line": 168, "column": null}}, "16": {"start": {"line": 170, "column": 4}, "end": {"line": 170, "column": null}}, "17": {"start": {"line": 183, "column": 4}, "end": {"line": 188, "column": null}}, "18": {"start": {"line": 201, "column": 4}, "end": {"line": 210, "column": null}}, "19": {"start": {"line": 211, "column": 4}, "end": {"line": 211, "column": null}}, "20": {"start": {"line": 224, "column": 4}, "end": {"line": 233, "column": null}}, "21": {"start": {"line": 234, "column": 4}, "end": {"line": 234, "column": null}}, "22": {"start": {"line": 247, "column": 4}, "end": {"line": 269, "column": null}}, "23": {"start": {"line": 282, "column": 4}, "end": {"line": 299, "column": null}}, "24": {"start": {"line": 311, "column": 4}, "end": {"line": 330, "column": null}}, "25": {"start": {"line": 316, "column": 8}, "end": {"line": 329, "column": null}}, "26": {"start": {"line": 362, "column": 4}, "end": {"line": 374, "column": null}}, "27": {"start": {"line": 366, "column": 8}, "end": {"line": 373, "column": null}}, "28": {"start": {"line": 376, "column": 4}, "end": {"line": 378, "column": null}}, "29": {"start": {"line": 377, "column": 8}, "end": {"line": 377, "column": null}}, "30": {"start": {"line": 380, "column": 4}, "end": {"line": 389, "column": null}}, "31": {"start": {"line": 381, "column": 8}, "end": {"line": 388, "column": null}}, "32": {"start": {"line": 391, "column": 21}, "end": {"line": 391, "column": null}}, "33": {"start": {"line": 392, "column": 4}, "end": {"line": 401, "column": null}}, "34": {"start": {"line": 393, "column": 8}, "end": {"line": 400, "column": null}}, "35": {"start": {"line": 403, "column": 17}, "end": {"line": 403, "column": null}}, "36": {"start": {"line": 404, "column": 4}, "end": {"line": 414, "column": null}}, "37": {"start": {"line": 405, "column": 8}, "end": {"line": 413, "column": null}}, "38": {"start": {"line": 416, "column": 4}, "end": {"line": 416, "column": null}}, "39": {"start": {"line": 436, "column": 21}, "end": {"line": 440, "column": null}}, "40": {"start": {"line": 441, "column": 4}, "end": {"line": 454, "column": null}}, "41": {"start": {"line": 442, "column": 8}, "end": {"line": 452, "column": null}}, "42": {"start": {"line": 453, "column": 8}, "end": {"line": 453, "column": null}}, "43": {"start": {"line": 455, "column": 4}, "end": {"line": 461, "column": null}}, "44": {"start": {"line": 483, "column": 40}, "end": {"line": 495, "column": null}}, "45": {"start": {"line": 496, "column": 22}, "end": {"line": 496, "column": null}}, "46": {"start": {"line": 498, "column": 8}, "end": {"line": 498, "column": null}}, "47": {"start": {"line": 500, "column": 8}, "end": {"line": 500, "column": null}}, "48": {"start": {"line": 502, "column": 4}, "end": {"line": 512, "column": null}}, "49": {"start": {"line": 503, "column": 8}, "end": {"line": 506, "column": null}}, "50": {"start": {"line": 508, "column": 8}, "end": {"line": 511, "column": null}}, "51": {"start": {"line": 514, "column": 4}, "end": {"line": 516, "column": null}}, "52": {"start": {"line": 529, "column": 22}, "end": {"line": 529, "column": null}}, "53": {"start": {"line": 530, "column": 29}, "end": {"line": 533, "column": null}}, "54": {"start": {"line": 534, "column": 4}, "end": {"line": 580, "column": null}}, "55": {"start": {"line": 535, "column": 33}, "end": {"line": 543, "column": null}}, "56": {"start": {"line": 540, "column": 16}, "end": {"line": 540, "column": null}}, "57": {"start": {"line": 541, "column": 16}, "end": {"line": 541, "column": null}}, "58": {"start": {"line": 545, "column": 8}, "end": {"line": 545, "column": null}}, "59": {"start": {"line": 547, "column": 21}, "end": {"line": 547, "column": null}}, "60": {"start": {"line": 548, "column": 8}, "end": {"line": 550, "column": null}}, "61": {"start": {"line": 549, "column": 12}, "end": {"line": 549, "column": null}}, "62": {"start": {"line": 552, "column": 25}, "end": {"line": 552, "column": null}}, "63": {"start": {"line": 553, "column": 8}, "end": {"line": 555, "column": null}}, "64": {"start": {"line": 554, "column": 12}, "end": {"line": 554, "column": null}}, "65": {"start": {"line": 561, "column": 12}, "end": {"line": 561, "column": null}}, "66": {"start": {"line": 562, "column": 23}, "end": {"line": 568, "column": null}}, "67": {"start": {"line": 570, "column": 8}, "end": {"line": 573, "column": null}}, "68": {"start": {"line": 578, "column": 8}, "end": {"line": 578, "column": null}}, "69": {"start": {"line": 579, "column": 8}, "end": {"line": 579, "column": null}}, "70": {"start": {"line": 595, "column": 23}, "end": {"line": 595, "column": null}}, "71": {"start": {"line": 598, "column": 4}, "end": {"line": 618, "column": null}}, "72": {"start": {"line": 599, "column": 8}, "end": {"line": 599, "column": null}}, "73": {"start": {"line": 600, "column": 8}, "end": {"line": 604, "column": null}}, "74": {"start": {"line": 606, "column": 8}, "end": {"line": 617, "column": null}}, "75": {"start": {"line": 607, "column": 12}, "end": {"line": 608, "column": null}}, "76": {"start": {"line": 609, "column": 12}, "end": {"line": 609, "column": null}}, "77": {"start": {"line": 611, "column": 12}, "end": {"line": 611, "column": null}}, "78": {"start": {"line": 612, "column": 12}, "end": {"line": 616, "column": null}}, "79": {"start": {"line": 620, "column": 8}, "end": {"line": 624, "column": null}}, "80": {"start": {"line": 625, "column": 4}, "end": {"line": 628, "column": null}}, "81": {"start": {"line": 638, "column": 8}, "end": {"line": 640, "column": null}}, "82": {"start": {"line": 639, "column": 12}, "end": {"line": 639, "column": null}}, "83": {"start": {"line": 642, "column": 24}, "end": {"line": 642, "column": null}}, "84": {"start": {"line": 643, "column": 8}, "end": {"line": 645, "column": null}}, "85": {"start": {"line": 644, "column": 12}, "end": {"line": 644, "column": null}}, "86": {"start": {"line": 647, "column": 25}, "end": {"line": 647, "column": null}}, "87": {"start": {"line": 648, "column": 8}, "end": {"line": 652, "column": null}}, "88": {"start": {"line": 651, "column": 16}, "end": {"line": 651, "column": null}}, "89": {"start": {"line": 655, "column": 4}, "end": {"line": 711, "column": null}}, "90": {"start": {"line": 656, "column": 8}, "end": {"line": 658, "column": null}}, "91": {"start": {"line": 657, "column": 12}, "end": {"line": 657, "column": null}}, "92": {"start": {"line": 660, "column": 26}, "end": {"line": 660, "column": null}}, "93": {"start": {"line": 661, "column": 8}, "end": {"line": 663, "column": null}}, "94": {"start": {"line": 662, "column": 12}, "end": {"line": 662, "column": null}}, "95": {"start": {"line": 665, "column": 26}, "end": {"line": 665, "column": null}}, "96": {"start": {"line": 666, "column": 23}, "end": {"line": 666, "column": null}}, "97": {"start": {"line": 667, "column": 8}, "end": {"line": 682, "column": null}}, "98": {"start": {"line": 668, "column": 32}, "end": {"line": 668, "column": null}}, "99": {"start": {"line": 670, "column": 28}, "end": {"line": 670, "column": null}}, "100": {"start": {"line": 681, "column": 26}, "end": {"line": 681, "column": null}}, "101": {"start": {"line": 683, "column": 8}, "end": {"line": 688, "column": null}}, "102": {"start": {"line": 684, "column": 12}, "end": {"line": 687, "column": null}}, "103": {"start": {"line": 693, "column": 30}, "end": {"line": 695, "column": null}}, "104": {"start": {"line": 696, "column": 8}, "end": {"line": 701, "column": null}}, "105": {"start": {"line": 697, "column": 12}, "end": {"line": 700, "column": null}}, "106": {"start": {"line": 702, "column": 8}, "end": {"line": 709, "column": null}}, "107": {"start": {"line": 703, "column": 12}, "end": {"line": 708, "column": null}}, "108": {"start": {"line": 704, "column": 35}, "end": {"line": 704, "column": null}}, "109": {"start": {"line": 710, "column": 8}, "end": {"line": 710, "column": null}}, "110": {"start": {"line": 713, "column": 4}, "end": {"line": 713, "column": null}}, "111": {"start": {"line": 715, "column": 4}, "end": {"line": 720, "column": null}}, "112": {"start": {"line": 716, "column": 8}, "end": {"line": 716, "column": null}}, "113": {"start": {"line": 717, "column": 8}, "end": {"line": 717, "column": null}}, "114": {"start": {"line": 718, "column": 8}, "end": {"line": 718, "column": null}}, "115": {"start": {"line": 719, "column": 8}, "end": {"line": 719, "column": null}}}, "fnMap": {"0": {"name": "reasonLength", "decl": {"start": {"line": 72, "column": 9}, "end": {"line": 72, "column": 22}}, "loc": {"start": {"line": 72, "column": 46}, "end": {"line": 74, "column": null}}}, "1": {"name": "evidenceQuality", "decl": {"start": {"line": 84, "column": 9}, "end": {"line": 84, "column": null}}, "loc": {"start": {"line": 89, "column": 27}, "end": {"line": 101, "column": null}}}, "2": {"name": "resultBase", "decl": {"start": {"line": 107, "column": 9}, "end": {"line": 107, "column": null}}, "loc": {"start": {"line": 112, "column": 27}, "end": {"line": 128, "column": null}}}, "3": {"name": "readPermissionReviewLogEnabled", "decl": {"start": {"line": 131, "column": 9}, "end": {"line": 131, "column": 51}}, "loc": {"start": {"line": 131, "column": 51}, "end": {"line": 147, "column": null}}}, "4": {"name": "resolveJudgeModel", "decl": {"start": {"line": 158, "column": 9}, "end": {"line": 158, "column": null}}, "loc": {"start": {"line": 162, "column": 112}, "end": {"line": 171, "column": null}}}, "5": {"name": "emitBase", "decl": {"start": {"line": 182, "column": 9}, "end": {"line": 182, "column": 18}}, "loc": {"start": {"line": 182, "column": 61}, "end": {"line": 189, "column": null}}}, "6": {"name": "preflightDefer", "decl": {"start": {"line": 195, "column": 9}, "end": {"line": 195, "column": null}}, "loc": {"start": {"line": 200, "column": 21}, "end": {"line": 212, "column": null}}}, "7": {"name": "infrastructureDefer", "decl": {"start": {"line": 218, "column": 9}, "end": {"line": 218, "column": null}}, "loc": {"start": {"line": 223, "column": 21}, "end": {"line": 235, "column": null}}}, "8": {"name": "emitJudgmentResult", "decl": {"start": {"line": 238, "column": 9}, "end": {"line": 238, "column": null}}, "loc": {"start": {"line": 246, "column": 8}, "end": {"line": 270, "column": null}}}, "9": {"name": "emitInfrastructureResult", "decl": {"start": {"line": 273, "column": 9}, "end": {"line": 273, "column": null}}, "loc": {"start": {"line": 281, "column": 8}, "end": {"line": 300, "column": null}}}, "10": {"name": "auditEnrollment", "decl": {"start": {"line": 307, "column": 9}, "end": {"line": 307, "column": null}}, "loc": {"start": {"line": 310, "column": 8}, "end": {"line": 331, "column": null}}}, "11": {"name": "runPreflightGates", "decl": {"start": {"line": 357, "column": 9}, "end": {"line": 357, "column": null}}, "loc": {"start": {"line": 361, "column": 17}, "end": {"line": 417, "column": null}}}, "12": {"name": "prepareModelCall", "decl": {"start": {"line": 431, "column": 9}, "end": {"line": 431, "column": null}}, "loc": {"start": {"line": 435, "column": 33}, "end": {"line": 462, "column": null}}}, "13": {"name": "enforceAndEmit", "decl": {"start": {"line": 474, "column": 9}, "end": {"line": 474, "column": null}}, "loc": {"start": {"line": 482, "column": 21}, "end": {"line": 517, "column": null}}}, "14": {"name": "judgeAuthorize", "decl": {"start": {"line": 524, "column": 15}, "end": {"line": 524, "column": null}}, "loc": {"start": {"line": 528, "column": 30}, "end": {"line": 581, "column": null}}}, "15": {"name": "(anonymous_15)", "decl": {"start": {"line": 539, "column": 24}, "end": {"line": 539, "column": 25}}, "loc": {"start": {"line": 539, "column": 36}, "end": {"line": 542, "column": null}}}, "16": {"name": "notifyEnforceActive", "decl": {"start": {"line": 589, "column": 9}, "end": {"line": 589, "column": null}}, "loc": {"start": {"line": 594, "column": 8}, "end": {"line": 629, "column": null}}}, "17": {"name": "permissionAiJudge", "decl": {"start": {"line": 633, "column": 24}, "end": {"line": 633, "column": 42}}, "loc": {"start": {"line": 633, "column": 66}, "end": {"line": 721, "column": null}}}, "18": {"name": "tryRegister", "decl": {"start": {"line": 637, "column": 13}, "end": {"line": 637, "column": 33}}, "loc": {"start": {"line": 637, "column": 33}, "end": {"line": 653, "column": null}}}, "19": {"name": "(anonymous_19)", "decl": {"start": {"line": 650, "column": 12}, "end": {"line": 650, "column": 19}}, "loc": {"start": {"line": 651, "column": 16}, "end": {"line": 651, "column": null}}}, "20": {"name": "(anonymous_20)", "decl": {"start": {"line": 655, "column": 27}, "end": {"line": 655, "column": 28}}, "loc": {"start": {"line": 655, "column": 44}, "end": {"line": 711, "column": 5}}}, "21": {"name": "(anonymous_21)", "decl": {"start": {"line": 668, "column": 26}, "end": {"line": 668, "column": 32}}, "loc": {"start": {"line": 668, "column": 32}, "end": {"line": 668, "column": null}}}, "22": {"name": "(anonymous_22)", "decl": {"start": {"line": 670, "column": 22}, "end": {"line": 670, "column": 28}}, "loc": {"start": {"line": 670, "column": 28}, "end": {"line": 670, "column": null}}}, "23": {"name": "(anonymous_23)", "decl": {"start": {"line": 681, "column": 20}, "end": {"line": 681, "column": 26}}, "loc": {"start": {"line": 681, "column": 26}, "end": {"line": 681, "column": null}}}, "24": {"name": "(anonymous_24)", "decl": {"start": {"line": 704, "column": 16}, "end": {"line": 704, "column": 17}}, "loc": {"start": {"line": 704, "column": 35}, "end": {"line": 704, "column": null}}}, "25": {"name": "(anonymous_25)", "decl": {"start": {"line": 715, "column": 30}, "end": {"line": 715, "column": 36}}, "loc": {"start": {"line": 715, "column": 36}, "end": {"line": 720, "column": 5}}}}, "branchMap": {"0": {"loc": {"start": {"line": 88, "column": 4}, "end": {"line": 88, "column": null}}, "type": "default-arg", "locations": [{"start": {"line": 88, "column": 42}, "end": {"line": 88, "column": null}}]}, "1": {"loc": {"start": {"line": 120, "column": 12}, "end": {"line": 123, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 122, "column": 18}, "end": {"line": 122, "column": null}}, {"start": {"line": 123, "column": 18}, "end": {"line": 123, "column": null}}]}, "2": {"loc": {"start": {"line": 120, "column": 12}, "end": {"line": 121, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 120, "column": 12}, "end": {"line": 120, "column": null}}, {"start": {"line": 121, "column": 16}, "end": {"line": 121, "column": null}}]}, "3": {"loc": {"start": {"line": 163, "column": 4}, "end": {"line": 165, "column": null}}, "type": "if", "locations": [{"start": {"line": 163, "column": 4}, "end": {"line": 165, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 167, "column": 4}, "end": {"line": 169, "column": null}}, "type": "if", "locations": [{"start": {"line": 167, "column": 4}, "end": {"line": 169, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 167, "column": 8}, "end": {"line": 167, "column": 67}}, "type": "binary-expr", "locations": [{"start": {"line": 167, "column": 8}, "end": {"line": 167, "column": 31}}, {"start": {"line": 167, "column": 31}, "end": {"line": 167, "column": 67}}]}, "6": {"loc": {"start": {"line": 199, "column": 4}, "end": {"line": 199, "column": null}}, "type": "default-arg", "locations": [{"start": {"line": 199, "column": 37}, "end": {"line": 199, "column": null}}]}, "7": {"loc": {"start": {"line": 222, "column": 4}, "end": {"line": 222, "column": null}}, "type": "default-arg", "locations": [{"start": {"line": 222, "column": 37}, "end": {"line": 222, "column": null}}]}, "8": {"loc": {"start": {"line": 259, "column": 22}, "end": {"line": 259, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 259, "column": 22}, "end": {"line": 259, "column": 30}}, {"start": {"line": 259, "column": 30}, "end": {"line": 259, "column": null}}]}, "9": {"loc": {"start": {"line": 291, "column": 18}, "end": {"line": 291, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 291, "column": 18}, "end": {"line": 291, "column": 47}}, {"start": {"line": 291, "column": 47}, "end": {"line": 291, "column": null}}]}, "10": {"loc": {"start": {"line": 292, "column": 15}, "end": {"line": 292, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 292, "column": 15}, "end": {"line": 292, "column": 41}}, {"start": {"line": 292, "column": 41}, "end": {"line": 292, "column": null}}]}, "11": {"loc": {"start": {"line": 293, "column": 13}, "end": {"line": 293, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 293, "column": 13}, "end": {"line": 293, "column": 37}}, {"start": {"line": 293, "column": 37}, "end": {"line": 293, "column": null}}]}, "12": {"loc": {"start": {"line": 294, "column": 22}, "end": {"line": 294, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 294, "column": 22}, "end": {"line": 294, "column": 30}}, {"start": {"line": 294, "column": 30}, "end": {"line": 294, "column": null}}]}, "13": {"loc": {"start": {"line": 295, "column": 20}, "end": {"line": 295, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 295, "column": 20}, "end": {"line": 295, "column": 42}}, {"start": {"line": 295, "column": 42}, "end": {"line": 295, "column": null}}]}, "14": {"loc": {"start": {"line": 296, "column": 21}, "end": {"line": 296, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 296, "column": 21}, "end": {"line": 296, "column": 44}}, {"start": {"line": 296, "column": 44}, "end": {"line": 296, "column": null}}]}, "15": {"loc": {"start": {"line": 311, "column": 4}, "end": {"line": 330, "column": null}}, "type": "if", "locations": [{"start": {"line": 311, "column": 4}, "end": {"line": 330, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 312, "column": 8}, "end": {"line": 314, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 312, "column": 8}, "end": {"line": 312, "column": null}}, {"start": {"line": 313, "column": 8}, "end": {"line": 313, "column": null}}, {"start": {"line": 314, "column": 8}, "end": {"line": 314, "column": null}}]}, "17": {"loc": {"start": {"line": 319, "column": 16}, "end": {"line": 322, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 321, "column": 22}, "end": {"line": 321, "column": null}}, {"start": {"line": 322, "column": 22}, "end": {"line": 322, "column": null}}]}, "18": {"loc": {"start": {"line": 319, "column": 16}, "end": {"line": 320, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 319, "column": 16}, "end": {"line": 319, "column": null}}, {"start": {"line": 320, "column": 20}, "end": {"line": 320, "column": null}}]}, "19": {"loc": {"start": {"line": 325, "column": 16}, "end": {"line": 328, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 327, "column": 22}, "end": {"line": 327, "column": null}}, {"start": {"line": 328, "column": 23}, "end": {"line": 328, "column": null}}]}, "20": {"loc": {"start": {"line": 325, "column": 16}, "end": {"line": 326, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 325, "column": 16}, "end": {"line": 325, "column": null}}, {"start": {"line": 326, "column": 20}, "end": {"line": 326, "column": null}}]}, "21": {"loc": {"start": {"line": 328, "column": 23}, "end": {"line": 328, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 328, "column": 23}, "end": {"line": 328, "column": 42}}, {"start": {"line": 328, "column": 42}, "end": {"line": 328, "column": null}}]}, "22": {"loc": {"start": {"line": 362, "column": 4}, "end": {"line": 374, "column": null}}, "type": "if", "locations": [{"start": {"line": 362, "column": 4}, "end": {"line": 374, "column": null}}, {"start": {}, "end": {}}]}, "23": {"loc": {"start": {"line": 363, "column": 8}, "end": {"line": 364, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 363, "column": 8}, "end": {"line": 363, "column": null}}, {"start": {"line": 364, "column": 8}, "end": {"line": 364, "column": null}}]}, "24": {"loc": {"start": {"line": 376, "column": 4}, "end": {"line": 378, "column": null}}, "type": "if", "locations": [{"start": {"line": 376, "column": 4}, "end": {"line": 378, "column": null}}, {"start": {}, "end": {}}]}, "25": {"loc": {"start": {"line": 380, "column": 4}, "end": {"line": 389, "column": null}}, "type": "if", "locations": [{"start": {"line": 380, "column": 4}, "end": {"line": 389, "column": null}}, {"start": {}, "end": {}}]}, "26": {"loc": {"start": {"line": 392, "column": 4}, "end": {"line": 401, "column": null}}, "type": "if", "locations": [{"start": {"line": 392, "column": 4}, "end": {"line": 401, "column": null}}, {"start": {}, "end": {}}]}, "27": {"loc": {"start": {"line": 404, "column": 4}, "end": {"line": 414, "column": null}}, "type": "if", "locations": [{"start": {"line": 404, "column": 4}, "end": {"line": 414, "column": null}}, {"start": {}, "end": {}}]}, "28": {"loc": {"start": {"line": 404, "column": 8}, "end": {"line": 404, "column": 66}}, "type": "binary-expr", "locations": [{"start": {"line": 404, "column": 8}, "end": {"line": 404, "column": 30}}, {"start": {"line": 404, "column": 30}, "end": {"line": 404, "column": 66}}]}, "29": {"loc": {"start": {"line": 441, "column": 4}, "end": {"line": 454, "column": null}}, "type": "if", "locations": [{"start": {"line": 441, "column": 4}, "end": {"line": 454, "column": null}}, {"start": {}, "end": {}}]}, "30": {"loc": {"start": {"line": 447, "column": 26}, "end": {"line": 447, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 447, "column": 26}, "end": {"line": 447, "column": 66}}, {"start": {"line": 447, "column": 66}, "end": {"line": 447, "column": null}}]}, "31": {"loc": {"start": {"line": 448, "column": 23}, "end": {"line": 448, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 448, "column": 23}, "end": {"line": 448, "column": 57}}, {"start": {"line": 448, "column": 57}, "end": {"line": 448, "column": null}}]}, "32": {"loc": {"start": {"line": 450, "column": 30}, "end": {"line": 450, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 450, "column": 30}, "end": {"line": 450, "column": 38}}, {"start": {"line": 450, "column": 38}, "end": {"line": 450, "column": null}}]}, "33": {"loc": {"start": {"line": 487, "column": 12}, "end": {"line": 489, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 488, "column": 18}, "end": {"line": 488, "column": null}}, {"start": {"line": 489, "column": 18}, "end": {"line": 489, "column": null}}]}, "34": {"loc": {"start": {"line": 491, "column": 12}, "end": {"line": 491, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 491, "column": 41}, "end": {"line": 491, "column": 58}}, {"start": {"line": 491, "column": 58}, "end": {"line": 491, "column": null}}]}, "35": {"loc": {"start": {"line": 498, "column": 8}, "end": {"line": 498, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 498, "column": 37}, "end": {"line": 498, "column": 47}}, {"start": {"line": 498, "column": 47}, "end": {"line": 498, "column": null}}]}, "36": {"loc": {"start": {"line": 500, "column": 8}, "end": {"line": 500, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 500, "column": 37}, "end": {"line": 500, "column": 44}}, {"start": {"line": 500, "column": 44}, "end": {"line": 500, "column": null}}]}, "37": {"loc": {"start": {"line": 502, "column": 4}, "end": {"line": 512, "column": null}}, "type": "if", "locations": [{"start": {"line": 502, "column": 4}, "end": {"line": 512, "column": null}}, {"start": {"line": 507, "column": 11}, "end": {"line": 512, "column": null}}]}, "38": {"loc": {"start": {"line": 514, "column": 11}, "end": {"line": 516, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 515, "column": 10}, "end": {"line": 515, "column": null}}, {"start": {"line": 516, "column": 10}, "end": {"line": 516, "column": null}}]}, "39": {"loc": {"start": {"line": 548, "column": 8}, "end": {"line": 550, "column": null}}, "type": "if", "locations": [{"start": {"line": 548, "column": 8}, "end": {"line": 550, "column": null}}, {"start": {}, "end": {}}]}, "40": {"loc": {"start": {"line": 553, "column": 8}, "end": {"line": 555, "column": null}}, "type": "if", "locations": [{"start": {"line": 553, "column": 8}, "end": {"line": 555, "column": null}}, {"start": {}, "end": {}}]}, "41": {"loc": {"start": {"line": 598, "column": 4}, "end": {"line": 618, "column": null}}, "type": "if", "locations": [{"start": {"line": 598, "column": 4}, "end": {"line": 618, "column": null}}, {"start": {"line": 605, "column": 11}, "end": {"line": 618, "column": null}}]}, "42": {"loc": {"start": {"line": 606, "column": 8}, "end": {"line": 617, "column": null}}, "type": "if", "locations": [{"start": {"line": 606, "column": 8}, "end": {"line": 617, "column": null}}, {"start": {"line": 610, "column": 15}, "end": {"line": 617, "column": null}}]}, "43": {"loc": {"start": {"line": 620, "column": 8}, "end": {"line": 624, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 621, "column": 14}, "end": {"line": 621, "column": null}}, {"start": {"line": 622, "column": 14}, "end": {"line": 624, "column": null}}]}, "44": {"loc": {"start": {"line": 622, "column": 14}, "end": {"line": 624, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 623, "column": 16}, "end": {"line": 623, "column": null}}, {"start": {"line": 624, "column": 16}, "end": {"line": 624, "column": null}}]}, "45": {"loc": {"start": {"line": 622, "column": 14}, "end": {"line": 622, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 622, "column": 14}, "end": {"line": 622, "column": 49}}, {"start": {"line": 622, "column": 49}, "end": {"line": 622, "column": null}}]}, "46": {"loc": {"start": {"line": 638, "column": 8}, "end": {"line": 640, "column": null}}, "type": "if", "locations": [{"start": {"line": 638, "column": 8}, "end": {"line": 640, "column": null}}, {"start": {}, "end": {}}]}, "47": {"loc": {"start": {"line": 638, "column": 12}, "end": {"line": 638, "column": 67}}, "type": "binary-expr", "locations": [{"start": {"line": 638, "column": 12}, "end": {"line": 638, "column": 47}}, {"start": {"line": 638, "column": 47}, "end": {"line": 638, "column": 67}}]}, "48": {"loc": {"start": {"line": 643, "column": 8}, "end": {"line": 645, "column": null}}, "type": "if", "locations": [{"start": {"line": 643, "column": 8}, "end": {"line": 645, "column": null}}, {"start": {}, "end": {}}]}, "49": {"loc": {"start": {"line": 656, "column": 8}, "end": {"line": 658, "column": null}}, "type": "if", "locations": [{"start": {"line": 656, "column": 8}, "end": {"line": 658, "column": null}}, {"start": {}, "end": {}}]}, "50": {"loc": {"start": {"line": 661, "column": 8}, "end": {"line": 663, "column": null}}, "type": "if", "locations": [{"start": {"line": 661, "column": 8}, "end": {"line": 663, "column": null}}, {"start": {}, "end": {}}]}, "51": {"loc": {"start": {"line": 702, "column": 8}, "end": {"line": 709, "column": null}}, "type": "if", "locations": [{"start": {"line": 702, "column": 8}, "end": {"line": 709, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 1, "1": 1, "2": 1, "3": 15, "4": 21, "5": 21, "6": 19, "7": 19, "8": 19, "9": 0, "10": 19, "11": 19, "12": 15, "13": 4, "14": 4, "15": 3, "16": 1, "17": 21, "18": 2, "19": 2, "20": 3, "21": 3, "22": 15, "23": 1, "24": 21, "25": 21, "26": 21, "27": 1, "28": 20, "29": 0, "30": 20, "31": 0, "32": 20, "33": 20, "34": 0, "35": 20, "36": 20, "37": 1, "38": 19, "39": 19, "40": 19, "41": 3, "42": 3, "43": 16, "44": 16, "45": 16, "46": 16, "47": 16, "48": 16, "49": 15, "50": 1, "51": 16, "52": 21, "53": 21, "54": 21, "55": 21, "56": 21, "57": 21, "58": 21, "59": 21, "60": 21, "61": 2, "62": 19, "63": 19, "64": 3, "65": 16, "66": 16, "67": 16, "68": 0, "69": 0, "70": 10, "71": 10, "72": 3, "73": 3, "74": 7, "75": 0, "76": 0, "77": 7, "78": 7, "79": 10, "80": 10, "81": 39, "82": 20, "83": 19, "84": 19, "85": 0, "86": 19, "87": 19, "88": 21, "89": 20, "90": 20, "91": 1, "92": 19, "93": 19, "94": 0, "95": 19, "96": 19, "97": 19, "98": 20, "99": 19, "100": 20, "101": 19, "102": 6, "103": 19, "104": 19, "105": 0, "106": 19, "107": 10, "108": 10, "109": 19, "110": 20, "111": 20, "112": 19, "113": 19, "114": 19, "115": 19}, "f": {"0": 15, "1": 21, "2": 21, "3": 19, "4": 19, "5": 21, "6": 2, "7": 3, "8": 15, "9": 1, "10": 21, "11": 21, "12": 19, "13": 16, "14": 21, "15": 21, "16": 10, "17": 20, "18": 39, "19": 21, "20": 20, "21": 20, "22": 19, "23": 20, "24": 10, "25": 19}, "b": {"0": [20], "1": [1, 20], "2": [21, 20], "3": [15, 4], "4": [3, 1], "5": [4, 2], "6": [1], "7": [0], "8": [15, 14], "9": [1, 0], "10": [1, 0], "11": [1, 0], "12": [1, 1], "13": [1, 1], "14": [1, 1], "15": [21, 0], "16": [21, 20, 20], "17": [1, 20], "18": [21, 20], "19": [21, 0], "20": [21, 21], "21": [0, 0], "22": [1, 20], "23": [21, 20], "24": [0, 20], "25": [0, 20], "26": [0, 20], "27": [1, 19], "28": [20, 3], "29": [3, 16], "30": [3, 0], "31": [3, 0], "32": [3, 2], "33": [15, 1], "34": [15, 1], "35": [8, 8], "36": [8, 8], "37": [15, 1], "38": [8, 8], "39": [2, 19], "40": [3, 16], "41": [3, 7], "42": [0, 7], "43": [7, 3], "44": [2, 1], "45": [3, 2], "46": [20, 19], "47": [39, 20], "48": [0, 19], "49": [1, 19], "50": [0, 19], "51": [10, 9]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/judge.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/judge.ts", "statementMap": {"0": {"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, "1": {"start": {"line": 42, "column": 8}, "end": {"line": 42, "column": null}}, "2": {"start": {"line": 44, "column": 4}, "end": {"line": 46, "column": null}}, "3": {"start": {"line": 45, "column": 8}, "end": {"line": 45, "column": null}}, "4": {"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, "5": {"start": {"line": 48, "column": 8}, "end": {"line": 48, "column": null}}, "6": {"start": {"line": 50, "column": 4}, "end": {"line": 52, "column": null}}, "7": {"start": {"line": 51, "column": 8}, "end": {"line": 51, "column": null}}, "8": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "9": {"start": {"line": 54, "column": 8}, "end": {"line": 54, "column": null}}, "10": {"start": {"line": 56, "column": 4}, "end": {"line": 58, "column": null}}, "11": {"start": {"line": 57, "column": 8}, "end": {"line": 57, "column": null}}, "12": {"start": {"line": 59, "column": 4}, "end": {"line": 61, "column": null}}, "13": {"start": {"line": 60, "column": 8}, "end": {"line": 60, "column": null}}, "14": {"start": {"line": 62, "column": 4}, "end": {"line": 62, "column": null}}}, "fnMap": {"0": {"name": "evaluateEnforceAuthority", "decl": {"start": {"line": 38, "column": 16}, "end": {"line": 38, "column": null}}, "loc": {"start": {"line": 40, "column": 18}, "end": {"line": 63, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, "type": "if", "locations": [{"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 44, "column": 4}, "end": {"line": 46, "column": null}}, "type": "if", "locations": [{"start": {"line": 44, "column": 4}, "end": {"line": 46, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, "type": "if", "locations": [{"start": {"line": 47, "column": 4}, "end": {"line": 49, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 50, "column": 4}, "end": {"line": 52, "column": null}}, "type": "if", "locations": [{"start": {"line": 50, "column": 4}, "end": {"line": 52, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "type": "if", "locations": [{"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 54, "column": 54}, "end": {"line": 54, "column": 77}}, "type": "binary-expr", "locations": [{"start": {"line": 54, "column": 54}, "end": {"line": 54, "column": 71}}, {"start": {"line": 54, "column": 71}, "end": {"line": 54, "column": 77}}]}, "6": {"loc": {"start": {"line": 56, "column": 4}, "end": {"line": 58, "column": null}}, "type": "if", "locations": [{"start": {"line": 56, "column": 4}, "end": {"line": 58, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 59, "column": 4}, "end": {"line": 61, "column": null}}, "type": "if", "locations": [{"start": {"line": 59, "column": 4}, "end": {"line": 61, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 28, "1": 9, "2": 19, "3": 1, "4": 18, "5": 3, "6": 15, "7": 2, "8": 13, "9": 2, "10": 11, "11": 1, "12": 10, "13": 1, "14": 9}, "f": {"0": 28}, "b": {"0": [9, 19], "1": [1, 18], "2": [3, 15], "3": [2, 13], "4": [2, 11], "5": [2, 0], "6": [1, 10], "7": [1, 9]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/model.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/model.ts", "statementMap": {"0": {"start": {"line": 18, "column": 34}, "end": {"line": 18, "column": null}}, "1": {"start": {"line": 19, "column": 30}, "end": {"line": 19, "column": null}}, "2": {"start": {"line": 20, "column": 30}, "end": {"line": 20, "column": null}}, "3": {"start": {"line": 26, "column": 26}, "end": {"line": 26, "column": null}}, "4": {"start": {"line": 87, "column": 4}, "end": {"line": 110, "column": null}}, "5": {"start": {"line": 90, "column": 12}, "end": {"line": 90, "column": null}}, "6": {"start": {"line": 93, "column": 12}, "end": {"line": 93, "column": null}}, "7": {"start": {"line": 97, "column": 12}, "end": {"line": 100, "column": null}}, "8": {"start": {"line": 103, "column": 12}, "end": {"line": 103, "column": null}}, "9": {"start": {"line": 107, "column": 12}, "end": {"line": 107, "column": null}}, "10": {"start": {"line": 109, "column": 12}, "end": {"line": 109, "column": null}}, "11": {"start": {"line": 114, "column": 4}, "end": {"line": 114, "column": null}}, "12": {"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, "13": {"start": {"line": 123, "column": 8}, "end": {"line": 123, "column": null}}, "14": {"start": {"line": 126, "column": 36}, "end": {"line": 130, "column": null}}, "15": {"start": {"line": 131, "column": 23}, "end": {"line": 131, "column": null}}, "16": {"start": {"line": 132, "column": 4}, "end": {"line": 134, "column": null}}, "17": {"start": {"line": 133, "column": 8}, "end": {"line": 133, "column": null}}, "18": {"start": {"line": 136, "column": 4}, "end": {"line": 151, "column": null}}, "19": {"start": {"line": 140, "column": 53}, "end": {"line": 145, "column": null}}, "20": {"start": {"line": 146, "column": 12}, "end": {"line": 148, "column": null}}, "21": {"start": {"line": 147, "column": 16}, "end": {"line": 147, "column": null}}, "22": {"start": {"line": 149, "column": 12}, "end": {"line": 149, "column": null}}, "23": {"start": {"line": 155, "column": 4}, "end": {"line": 155, "column": null}}, "24": {"start": {"line": 159, "column": 4}, "end": {"line": 159, "column": null}}, "25": {"start": {"line": 183, "column": 25}, "end": {"line": 183, "column": null}}, "26": {"start": {"line": 184, "column": 4}, "end": {"line": 190, "column": null}}, "27": {"start": {"line": 189, "column": 8}, "end": {"line": 189, "column": null}}, "28": {"start": {"line": 192, "column": 18}, "end": {"line": 194, "column": null}}, "29": {"start": {"line": 193, "column": 18}, "end": {"line": 193, "column": null}}, "30": {"start": {"line": 195, "column": 4}, "end": {"line": 200, "column": null}}, "31": {"start": {"line": 199, "column": 8}, "end": {"line": 199, "column": null}}, "32": {"start": {"line": 202, "column": 17}, "end": {"line": 202, "column": null}}, "33": {"start": {"line": 203, "column": 4}, "end": {"line": 205, "column": null}}, "34": {"start": {"line": 204, "column": 8}, "end": {"line": 204, "column": null}}, "35": {"start": {"line": 206, "column": 17}, "end": {"line": 206, "column": null}}, "36": {"start": {"line": 207, "column": 4}, "end": {"line": 209, "column": null}}, "37": {"start": {"line": 208, "column": 8}, "end": {"line": 208, "column": null}}, "38": {"start": {"line": 210, "column": 4}, "end": {"line": 212, "column": null}}, "39": {"start": {"line": 211, "column": 8}, "end": {"line": 211, "column": null}}, "40": {"start": {"line": 213, "column": 4}, "end": {"line": 215, "column": null}}, "41": {"start": {"line": 214, "column": 8}, "end": {"line": 214, "column": null}}, "42": {"start": {"line": 217, "column": 19}, "end": {"line": 217, "column": null}}, "43": {"start": {"line": 218, "column": 4}, "end": {"line": 223, "column": null}}, "44": {"start": {"line": 222, "column": 8}, "end": {"line": 222, "column": null}}, "45": {"start": {"line": 225, "column": 4}, "end": {"line": 225, "column": null}}, "46": {"start": {"line": 236, "column": 4}, "end": {"line": 247, "column": null}}, "47": {"start": {"line": 237, "column": 8}, "end": {"line": 246, "column": null}}, "48": {"start": {"line": 249, "column": 22}, "end": {"line": 249, "column": null}}, "49": {"start": {"line": 250, "column": 46}, "end": {"line": 250, "column": null}}, "50": {"start": {"line": 251, "column": 45}, "end": {"line": 251, "column": null}}, "51": {"start": {"line": 252, "column": 24}, "end": {"line": 252, "column": null}}, "52": {"start": {"line": 253, "column": 20}, "end": {"line": 261, "column": null}}, "53": {"start": {"line": 253, "column": 65}, "end": {"line": 261, "column": null}}, "54": {"start": {"line": 262, "column": 30}, "end": {"line": 262, "column": null}}, "55": {"start": {"line": 263, "column": 30}, "end": {"line": 263, "column": null}}, "56": {"start": {"line": 264, "column": 30}, "end": {"line": 264, "column": null}}, "57": {"start": {"line": 264, "column": 42}, "end": {"line": 264, "column": null}}, "58": {"start": {"line": 265, "column": 29}, "end": {"line": 265, "column": null}}, "59": {"start": {"line": 265, "column": 41}, "end": {"line": 265, "column": null}}, "60": {"start": {"line": 266, "column": 4}, "end": {"line": 266, "column": null}}, "61": {"start": {"line": 267, "column": 4}, "end": {"line": 269, "column": null}}, "62": {"start": {"line": 270, "column": 18}, "end": {"line": 270, "column": null}}, "63": {"start": {"line": 270, "column": 35}, "end": {"line": 270, "column": 62}}, "64": {"start": {"line": 272, "column": 4}, "end": {"line": 337, "column": null}}, "65": {"start": {"line": 273, "column": 8}, "end": {"line": 275, "column": null}}, "66": {"start": {"line": 274, "column": 12}, "end": {"line": 274, "column": null}}, "67": {"start": {"line": 277, "column": 8}, "end": {"line": 277, "column": null}}, "68": {"start": {"line": 278, "column": 8}, "end": {"line": 278, "column": null}}, "69": {"start": {"line": 279, "column": 25}, "end": {"line": 282, "column": null}}, "70": {"start": {"line": 284, "column": 8}, "end": {"line": 286, "column": null}}, "71": {"start": {"line": 285, "column": 12}, "end": {"line": 285, "column": null}}, "72": {"start": {"line": 291, "column": 8}, "end": {"line": 293, "column": null}}, "73": {"start": {"line": 292, "column": 12}, "end": {"line": 292, "column": null}}, "74": {"start": {"line": 294, "column": 8}, "end": {"line": 296, "column": null}}, "75": {"start": {"line": 295, "column": 12}, "end": {"line": 295, "column": null}}, "76": {"start": {"line": 297, "column": 8}, "end": {"line": 299, "column": null}}, "77": {"start": {"line": 298, "column": 12}, "end": {"line": 298, "column": null}}, "78": {"start": {"line": 303, "column": 28}, "end": {"line": 303, "column": null}}, "79": {"start": {"line": 304, "column": 29}, "end": {"line": 304, "column": null}}, "80": {"start": {"line": 305, "column": 8}, "end": {"line": 307, "column": null}}, "81": {"start": {"line": 306, "column": 12}, "end": {"line": 306, "column": null}}, "82": {"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, "83": {"start": {"line": 309, "column": 12}, "end": {"line": 309, "column": null}}, "84": {"start": {"line": 312, "column": 26}, "end": {"line": 312, "column": null}}, "85": {"start": {"line": 313, "column": 8}, "end": {"line": 315, "column": null}}, "86": {"start": {"line": 314, "column": 12}, "end": {"line": 314, "column": null}}, "87": {"start": {"line": 317, "column": 8}, "end": {"line": 325, "column": null}}, "88": {"start": {"line": 327, "column": 41}, "end": {"line": 331, "column": null}}, "89": {"start": {"line": 332, "column": 8}, "end": {"line": 332, "column": null}}, "90": {"start": {"line": 334, "column": 8}, "end": {"line": 334, "column": null}}, "91": {"start": {"line": 335, "column": 8}, "end": {"line": 335, "column": null}}, "92": {"start": {"line": 336, "column": 8}, "end": {"line": 336, "column": null}}}, "fnMap": {"0": {"name": "forcedToolChoice", "decl": {"start": {"line": 86, "column": 9}, "end": {"line": 86, "column": 26}}, "loc": {"start": {"line": 86, "column": 60}, "end": {"line": 111, "column": null}}}, "1": {"name": "enforcesOutputCap", "decl": {"start": {"line": 113, "column": 9}, "end": {"line": 113, "column": 27}}, "loc": {"start": {"line": 113, "column": 49}, "end": {"line": 115, "column": null}}}, "2": {"name": "createModelAvailability", "decl": {"start": {"line": 118, "column": 16}, "end": {"line": 118, "column": null}}, "loc": {"start": {"line": 121, "column": 21}, "end": {"line": 152, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 139, "column": 18}, "end": {"line": 139, "column": 19}}, "loc": {"start": {"line": 139, "column": 39}, "end": {"line": 150, "column": null}}}, "4": {"name": "isVerdict", "decl": {"start": {"line": 154, "column": 9}, "end": {"line": 154, "column": 19}}, "loc": {"start": {"line": 154, "column": 61}, "end": {"line": 156, "column": null}}}, "5": {"name": "codePointLength", "decl": {"start": {"line": 158, "column": 9}, "end": {"line": 158, "column": 25}}, "loc": {"start": {"line": 158, "column": 48}, "end": {"line": 160, "column": null}}}, "6": {"name": "validateVerdictResponse", "decl": {"start": {"line": 182, "column": 9}, "end": {"line": 182, "column": 33}}, "loc": {"start": {"line": 182, "column": 78}, "end": {"line": 226, "column": null}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 193, "column": 8}, "end": {"line": 193, "column": 9}}, "loc": {"start": {"line": 193, "column": 18}, "end": {"line": 193, "column": null}}}, "8": {"name": "requestStructuredVerdict", "decl": {"start": {"line": 229, "column": 22}, "end": {"line": 229, "column": null}}, "loc": {"start": {"line": 235, "column": 25}, "end": {"line": 338, "column": null}}}, "9": {"name": "(anonymous_9)", "decl": {"start": {"line": 253, "column": 20}, "end": {"line": 253, "column": 21}}, "loc": {"start": {"line": 253, "column": 65}, "end": {"line": 261, "column": null}}}, "10": {"name": "(anonymous_10)", "decl": {"start": {"line": 264, "column": 30}, "end": {"line": 264, "column": 42}}, "loc": {"start": {"line": 264, "column": 42}, "end": {"line": 264, "column": null}}}, "11": {"name": "(anonymous_11)", "decl": {"start": {"line": 265, "column": 29}, "end": {"line": 265, "column": 41}}, "loc": {"start": {"line": 265, "column": 41}, "end": {"line": 265, "column": null}}}, "12": {"name": "(anonymous_12)", "decl": {"start": {"line": 270, "column": 29}, "end": {"line": 270, "column": 35}}, "loc": {"start": {"line": 270, "column": 35}, "end": {"line": 270, "column": 62}}}}, "branchMap": {"0": {"loc": {"start": {"line": 87, "column": 4}, "end": {"line": 110, "column": null}}, "type": "switch", "locations": [{"start": {"line": 88, "column": 8}, "end": {"line": 88, "column": null}}, {"start": {"line": 89, "column": 8}, "end": {"line": 90, "column": null}}, {"start": {"line": 91, "column": 8}, "end": {"line": 91, "column": null}}, {"start": {"line": 92, "column": 8}, "end": {"line": 93, "column": null}}, {"start": {"line": 94, "column": 8}, "end": {"line": 94, "column": null}}, {"start": {"line": 95, "column": 8}, "end": {"line": 95, "column": null}}, {"start": {"line": 96, "column": 8}, "end": {"line": 100, "column": null}}, {"start": {"line": 101, "column": 8}, "end": {"line": 101, "column": null}}, {"start": {"line": 102, "column": 8}, "end": {"line": 103, "column": null}}, {"start": {"line": 104, "column": 8}, "end": {"line": 107, "column": null}}, {"start": {"line": 108, "column": 8}, "end": {"line": 109, "column": null}}]}, "1": {"loc": {"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, "type": "if", "locations": [{"start": {"line": 122, "column": 4}, "end": {"line": 124, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 132, "column": 4}, "end": {"line": 134, "column": null}}, "type": "if", "locations": [{"start": {"line": 132, "column": 4}, "end": {"line": 134, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 146, "column": 12}, "end": {"line": 148, "column": null}}, "type": "if", "locations": [{"start": {"line": 146, "column": 12}, "end": {"line": 148, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 155, "column": 11}, "end": {"line": 155, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 155, "column": 11}, "end": {"line": 155, "column": 32}}, {"start": {"line": 155, "column": 32}, "end": {"line": 155, "column": 52}}, {"start": {"line": 155, "column": 52}, "end": {"line": 155, "column": null}}]}, "5": {"loc": {"start": {"line": 184, "column": 4}, "end": {"line": 190, "column": null}}, "type": "if", "locations": [{"start": {"line": 184, "column": 4}, "end": {"line": 190, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 185, "column": 8}, "end": {"line": 187, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 185, "column": 8}, "end": {"line": 185, "column": null}}, {"start": {"line": 186, "column": 8}, "end": {"line": 186, "column": null}}, {"start": {"line": 187, "column": 8}, "end": {"line": 187, "column": null}}]}, "7": {"loc": {"start": {"line": 195, "column": 4}, "end": {"line": 200, "column": null}}, "type": "if", "locations": [{"start": {"line": 195, "column": 4}, "end": {"line": 200, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 196, "column": 8}, "end": {"line": 197, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 196, "column": 8}, "end": {"line": 196, "column": null}}, {"start": {"line": 197, "column": 8}, "end": {"line": 197, "column": null}}]}, "9": {"loc": {"start": {"line": 203, "column": 4}, "end": {"line": 205, "column": null}}, "type": "if", "locations": [{"start": {"line": 203, "column": 4}, "end": {"line": 205, "column": null}}, {"start": {}, "end": {}}]}, "10": {"loc": {"start": {"line": 203, "column": 8}, "end": {"line": 203, "column": 74}}, "type": "binary-expr", "locations": [{"start": {"line": 203, "column": 8}, "end": {"line": 203, "column": 25}}, {"start": {"line": 203, "column": 25}, "end": {"line": 203, "column": 53}}, {"start": {"line": 203, "column": 53}, "end": {"line": 203, "column": 74}}]}, "11": {"loc": {"start": {"line": 207, "column": 4}, "end": {"line": 209, "column": null}}, "type": "if", "locations": [{"start": {"line": 207, "column": 4}, "end": {"line": 209, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 207, "column": 8}, "end": {"line": 207, "column": 76}}, "type": "binary-expr", "locations": [{"start": {"line": 207, "column": 8}, "end": {"line": 207, "column": 29}}, {"start": {"line": 207, "column": 29}, "end": {"line": 207, "column": 53}}, {"start": {"line": 207, "column": 53}, "end": {"line": 207, "column": 76}}]}, "13": {"loc": {"start": {"line": 210, "column": 4}, "end": {"line": 212, "column": null}}, "type": "if", "locations": [{"start": {"line": 210, "column": 4}, "end": {"line": 212, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 213, "column": 4}, "end": {"line": 215, "column": null}}, "type": "if", "locations": [{"start": {"line": 213, "column": 4}, "end": {"line": 215, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 218, "column": 4}, "end": {"line": 223, "column": null}}, "type": "if", "locations": [{"start": {"line": 218, "column": 4}, "end": {"line": 223, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 219, "column": 8}, "end": {"line": 220, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 219, "column": 8}, "end": {"line": 219, "column": null}}, {"start": {"line": 220, "column": 8}, "end": {"line": 220, "column": null}}]}, "17": {"loc": {"start": {"line": 233, "column": 4}, "end": {"line": 233, "column": null}}, "type": "default-arg", "locations": [{"start": {"line": 233, "column": 16}, "end": {"line": 233, "column": null}}]}, "18": {"loc": {"start": {"line": 236, "column": 4}, "end": {"line": 247, "column": null}}, "type": "if", "locations": [{"start": {"line": 236, "column": 4}, "end": {"line": 247, "column": null}}, {"start": {}, "end": {}}]}, "19": {"loc": {"start": {"line": 241, "column": 16}, "end": {"line": 243, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 242, "column": 22}, "end": {"line": 242, "column": null}}, {"start": {"line": 243, "column": 22}, "end": {"line": 243, "column": null}}]}, "20": {"loc": {"start": {"line": 260, "column": 24}, "end": {"line": 260, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 260, "column": 38}, "end": {"line": 260, "column": 67}}, {"start": {"line": 260, "column": 67}, "end": {"line": 260, "column": null}}]}, "21": {"loc": {"start": {"line": 273, "column": 8}, "end": {"line": 275, "column": null}}, "type": "if", "locations": [{"start": {"line": 273, "column": 8}, "end": {"line": 275, "column": null}}, {"start": {}, "end": {}}]}, "22": {"loc": {"start": {"line": 284, "column": 8}, "end": {"line": 286, "column": null}}, "type": "if", "locations": [{"start": {"line": 284, "column": 8}, "end": {"line": 286, "column": null}}, {"start": {}, "end": {}}]}, "23": {"loc": {"start": {"line": 291, "column": 8}, "end": {"line": 293, "column": null}}, "type": "if", "locations": [{"start": {"line": 291, "column": 8}, "end": {"line": 293, "column": null}}, {"start": {}, "end": {}}]}, "24": {"loc": {"start": {"line": 294, "column": 8}, "end": {"line": 296, "column": null}}, "type": "if", "locations": [{"start": {"line": 294, "column": 8}, "end": {"line": 296, "column": null}}, {"start": {}, "end": {}}]}, "25": {"loc": {"start": {"line": 297, "column": 8}, "end": {"line": 299, "column": null}}, "type": "if", "locations": [{"start": {"line": 297, "column": 8}, "end": {"line": 299, "column": null}}, {"start": {}, "end": {}}]}, "26": {"loc": {"start": {"line": 305, "column": 8}, "end": {"line": 307, "column": null}}, "type": "if", "locations": [{"start": {"line": 305, "column": 8}, "end": {"line": 307, "column": null}}, {"start": {}, "end": {}}]}, "27": {"loc": {"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, "type": "if", "locations": [{"start": {"line": 308, "column": 8}, "end": {"line": 310, "column": null}}, {"start": {}, "end": {}}]}, "28": {"loc": {"start": {"line": 313, "column": 8}, "end": {"line": 315, "column": null}}, "type": "if", "locations": [{"start": {"line": 313, "column": 8}, "end": {"line": 315, "column": null}}, {"start": {}, "end": {}}]}, "29": {"loc": {"start": {"line": 327, "column": 41}, "end": {"line": 331, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 328, "column": 14}, "end": {"line": 328, "column": null}}, {"start": {"line": 329, "column": 14}, "end": {"line": 331, "column": null}}]}, "30": {"loc": {"start": {"line": 329, "column": 14}, "end": {"line": 331, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 330, "column": 16}, "end": {"line": 330, "column": null}}, {"start": {"line": 331, "column": 16}, "end": {"line": 331, "column": null}}]}}, "s": {"0": 5, "1": 5, "2": 5, "3": 5, "4": 30, "5": 3, "6": 2, "7": 3, "8": 2, "9": 19, "10": 1, "11": 30, "12": 31, "13": 1, "14": 30, "15": 30, "16": 30, "17": 1, "18": 29, "19": 30, "20": 30, "21": 10, "22": 30, "23": 23, "24": 19, "25": 34, "26": 34, "27": 3, "28": 31, "29": 32, "30": 31, "31": 4, "32": 27, "33": 27, "34": 2, "35": 25, "36": 25, "37": 2, "38": 23, "39": 1, "40": 22, "41": 1, "42": 21, "43": 21, "44": 2, "45": 19, "46": 41, "47": 2, "48": 39, "49": 39, "50": 39, "51": 39, "52": 39, "53": 20, "54": 39, "55": 39, "56": 39, "57": 0, "58": 39, "59": 2, "60": 39, "61": 39, "62": 39, "63": 2, "64": 39, "65": 39, "66": 1, "67": 38, "68": 38, "69": 38, "70": 36, "71": 0, "72": 36, "73": 1, "74": 35, "75": 0, "76": 35, "77": 1, "78": 34, "79": 34, "80": 34, "81": 34, "82": 34, "83": 33, "84": 34, "85": 34, "86": 15, "87": 19, "88": 2, "89": 2, "90": 39, "91": 39, "92": 39}, "f": {"0": 30, "1": 30, "2": 31, "3": 30, "4": 23, "5": 19, "6": 34, "7": 32, "8": 41, "9": 20, "10": 0, "11": 2, "12": 2}, "b": {"0": [2, 3, 1, 2, 1, 2, 3, 1, 2, 19, 1], "1": [1, 30], "2": [1, 29], "3": [10, 20], "4": [23, 5, 5], "5": [3, 31], "6": [34, 33, 32], "7": [4, 27], "8": [31, 28], "9": [2, 25], "10": [27, 26, 26], "11": [2, 23], "12": [25, 23, 23], "13": [1, 22], "14": [1, 21], "15": [2, 19], "16": [21, 19], "17": [20], "18": [2, 39], "19": [1, 1], "20": [19, 1], "21": [1, 38], "22": [0, 36], "23": [1, 35], "24": [0, 35], "25": [1, 34], "26": [34, 0], "27": [33, 1], "28": [15, 19], "29": [0, 2], "30": [1, 1]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/prompt.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/prompt.ts", "statementMap": {"0": {"start": {"line": 5, "column": 30}, "end": {"line": 5, "column": null}}, "1": {"start": {"line": 6, "column": 35}, "end": {"line": 6, "column": null}}, "2": {"start": {"line": 7, "column": 40}, "end": {"line": 7, "column": null}}, "3": {"start": {"line": 8, "column": 38}, "end": {"line": 8, "column": null}}, "4": {"start": {"line": 10, "column": 22}, "end": {"line": 10, "column": null}}, "5": {"start": {"line": 22, "column": 34}, "end": {"line": 42, "column": null}}, "6": {"start": {"line": 49, "column": 18}, "end": {"line": 53, "column": null}}, "7": {"start": {"line": 54, "column": 4}, "end": {"line": 58, "column": null}}, "8": {"start": {"line": 55, "column": 8}, "end": {"line": 57, "column": null}}, "9": {"start": {"line": 60, "column": 19}, "end": {"line": 65, "column": null}}, "10": {"start": {"line": 66, "column": 4}, "end": {"line": 85, "column": null}}, "11": {"start": {"line": 67, "column": 8}, "end": {"line": 69, "column": null}}, "12": {"start": {"line": 71, "column": 8}, "end": {"line": 71, "column": null}}, "13": {"start": {"line": 72, "column": 8}, "end": {"line": 74, "column": null}}, "14": {"start": {"line": 73, "column": 12}, "end": {"line": 73, "column": null}}, "15": {"start": {"line": 75, "column": 8}, "end": {"line": 79, "column": null}}, "16": {"start": {"line": 76, "column": 12}, "end": {"line": 78, "column": null}}, "17": {"start": {"line": 80, "column": 8}, "end": {"line": 84, "column": null}}, "18": {"start": {"line": 81, "column": 12}, "end": {"line": 83, "column": null}}, "19": {"start": {"line": 87, "column": 4}, "end": {"line": 89, "column": null}}, "20": {"start": {"line": 91, "column": 33}, "end": {"line": 95, "column": null}}, "21": {"start": {"line": 97, "column": 4}, "end": {"line": 101, "column": null}}, "22": {"start": {"line": 120, "column": 17}, "end": {"line": 127, "column": null}}, "23": {"start": {"line": 120, "column": 49}, "end": {"line": 127, "column": null}}, "24": {"start": {"line": 128, "column": 20}, "end": {"line": 151, "column": null}}, "25": {"start": {"line": 128, "column": 90}, "end": {"line": 151, "column": null}}, "26": {"start": {"line": 153, "column": 4}, "end": {"line": 191, "column": null}}}, "fnMap": {"0": {"name": "buildJudgeContext", "decl": {"start": {"line": 45, "column": 16}, "end": {"line": 45, "column": null}}, "loc": {"start": {"line": 48, "column": 11}, "end": {"line": 102, "column": null}}}, "1": {"name": "fewShotExamples", "decl": {"start": {"line": 119, "column": 9}, "end": {"line": 119, "column": 66}}, "loc": {"start": {"line": 119, "column": 66}, "end": {"line": 192, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 120, "column": 17}, "end": {"line": 120, "column": 18}}, "loc": {"start": {"line": 120, "column": 49}, "end": {"line": 127, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 128, "column": 20}, "end": {"line": 128, "column": 21}}, "loc": {"start": {"line": 128, "column": 90}, "end": {"line": 151, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 54, "column": 4}, "end": {"line": 58, "column": null}}, "type": "if", "locations": [{"start": {"line": 54, "column": 4}, "end": {"line": 58, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 60, "column": 19}, "end": {"line": 65, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 60, "column": 19}, "end": {"line": 60, "column": 35}}, {"start": {"line": 60, "column": 35}, "end": {"line": 65, "column": null}}]}, "2": {"loc": {"start": {"line": 66, "column": 4}, "end": {"line": 85, "column": null}}, "type": "if", "locations": [{"start": {"line": 66, "column": 4}, "end": {"line": 85, "column": null}}, {"start": {"line": 70, "column": 11}, "end": {"line": 85, "column": null}}]}, "3": {"loc": {"start": {"line": 75, "column": 8}, "end": {"line": 79, "column": null}}, "type": "if", "locations": [{"start": {"line": 75, "column": 8}, "end": {"line": 79, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 80, "column": 8}, "end": {"line": 84, "column": null}}, "type": "if", "locations": [{"start": {"line": 80, "column": 8}, "end": {"line": 84, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 6, "1": 6, "2": 6, "3": 6, "4": 6, "5": 6, "6": 41, "7": 41, "8": 37, "9": 41, "10": 41, "11": 37, "12": 4, "13": 4, "14": 4, "15": 4, "16": 0, "17": 4, "18": 0, "19": 41, "20": 41, "21": 41, "22": 41, "23": 123, "24": 41, "25": 123, "26": 41}, "f": {"0": 41, "1": 41, "2": 123, "3": 123}, "b": {"0": [37, 4], "1": [41, 22], "2": [37, 4], "3": [0, 4], "4": [0, 4]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/review.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/review.ts", "statementMap": {"0": {"start": {"line": 36, "column": 31}, "end": {"line": 42, "column": null}}, "1": {"start": {"line": 64, "column": 43}, "end": {"line": 64, "column": null}}, "2": {"start": {"line": 65, "column": 4}, "end": {"line": 70, "column": null}}, "3": {"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, "4": {"start": {"line": 66, "column": 53}, "end": {"line": 66, "column": 70}}, "5": {"start": {"line": 67, "column": 12}, "end": {"line": 67, "column": null}}, "6": {"start": {"line": 69, "column": 8}, "end": {"line": 69, "column": null}}, "7": {"start": {"line": 71, "column": 4}, "end": {"line": 71, "column": null}}, "8": {"start": {"line": 75, "column": 34}, "end": {"line": 77, "column": null}}, "9": {"start": {"line": 78, "column": 4}, "end": {"line": 93, "column": null}}, "10": {"start": {"line": 79, "column": 22}, "end": {"line": 79, "column": null}}, "11": {"start": {"line": 81, "column": 12}, "end": {"line": 87, "column": null}}, "12": {"start": {"line": 85, "column": 16}, "end": {"line": 85, "column": null}}, "13": {"start": {"line": 86, "column": 16}, "end": {"line": 86, "column": null}}, "14": {"start": {"line": 88, "column": 12}, "end": {"line": 88, "column": null}}, "15": {"start": {"line": 91, "column": 12}, "end": {"line": 91, "column": null}}}, "fnMap": {"0": {"name": "stripForbiddenKeys", "decl": {"start": {"line": 61, "column": 16}, "end": {"line": 61, "column": null}}, "loc": {"start": {"line": 63, "column": 27}, "end": {"line": 72, "column": null}}}, "1": {"name": "(anonymous_1)", "decl": {"start": {"line": 66, "column": 40}, "end": {"line": 66, "column": 41}}, "loc": {"start": {"line": 66, "column": 53}, "end": {"line": 66, "column": 70}}}, "2": {"name": "createReviewSink", "decl": {"start": {"line": 74, "column": 16}, "end": {"line": 74, "column": 33}}, "loc": {"start": {"line": 74, "column": 67}, "end": {"line": 94, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 79, "column": 16}, "end": {"line": 79, "column": 22}}, "loc": {"start": {"line": 79, "column": 22}, "end": {"line": 79, "column": null}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 80, "column": 16}, "end": {"line": 80, "column": 17}}, "loc": {"start": {"line": 80, "column": 36}, "end": {"line": 89, "column": null}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 90, "column": 15}, "end": {"line": 90, "column": 16}}, "loc": {"start": {"line": 90, "column": 35}, "end": {"line": 92, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, "type": "if", "locations": [{"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 75, "column": 34}, "end": {"line": 77, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 76, "column": 10}, "end": {"line": 76, "column": null}}, {"start": {"line": 77, "column": 10}, "end": {"line": 77, "column": null}}]}, "2": {"loc": {"start": {"line": 81, "column": 12}, "end": {"line": 87, "column": null}}, "type": "if", "locations": [{"start": {"line": 81, "column": 12}, "end": {"line": 87, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 3, "1": 70, "2": 70, "3": 1080, "4": 5384, "5": 7, "6": 1073, "7": 70, "8": 26, "9": 26, "10": 18, "11": 23, "12": 0, "13": 0, "14": 23, "15": 1}, "f": {"0": 70, "1": 5384, "2": 26, "3": 18, "4": 23, "5": 1}, "b": {"0": [7, 1073], "1": [25, 1], "2": [0, 23]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/analyzer/analyze.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/analyzer/analyze.ts", "statementMap": {"0": {"start": {"line": 118, "column": 24}, "end": {"line": 124, "column": null}}, "1": {"start": {"line": 126, "column": 30}, "end": {"line": 126, "column": null}}, "2": {"start": {"line": 129, "column": 4}, "end": {"line": 129, "column": null}}, "3": {"start": {"line": 133, "column": 4}, "end": {"line": 133, "column": null}}, "4": {"start": {"line": 137, "column": 4}, "end": {"line": 137, "column": null}}, "5": {"start": {"line": 141, "column": 4}, "end": {"line": 141, "column": null}}, "6": {"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, "7": {"start": {"line": 146, "column": 8}, "end": {"line": 146, "column": null}}, "8": {"start": {"line": 148, "column": 18}, "end": {"line": 151, "column": null}}, "9": {"start": {"line": 152, "column": 4}, "end": {"line": 152, "column": null}}, "10": {"start": {"line": 156, "column": 20}, "end": {"line": 158, "column": null}}, "11": {"start": {"line": 157, "column": 36}, "end": {"line": 157, "column": 79}}, "12": {"start": {"line": 158, "column": 24}, "end": {"line": 158, "column": 29}}, "13": {"start": {"line": 159, "column": 4}, "end": {"line": 161, "column": null}}, "14": {"start": {"line": 160, "column": 8}, "end": {"line": 160, "column": null}}, "15": {"start": {"line": 162, "column": 4}, "end": {"line": 167, "column": null}}, "16": {"start": {"line": 174, "column": 19}, "end": {"line": 174, "column": null}}, "17": {"start": {"line": 175, "column": 4}, "end": {"line": 186, "column": null}}, "18": {"start": {"line": 179, "column": 12}, "end": {"line": 179, "column": null}}, "19": {"start": {"line": 183, "column": 12}, "end": {"line": 183, "column": null}}, "20": {"start": {"line": 185, "column": 12}, "end": {"line": 185, "column": null}}, "21": {"start": {"line": 200, "column": 21}, "end": {"line": 200, "column": null}}, "22": {"start": {"line": 201, "column": 20}, "end": {"line": 201, "column": null}}, "23": {"start": {"line": 202, "column": 21}, "end": {"line": 202, "column": null}}, "24": {"start": {"line": 203, "column": 24}, "end": {"line": 203, "column": null}}, "25": {"start": {"line": 205, "column": 4}, "end": {"line": 239, "column": null}}, "26": {"start": {"line": 206, "column": 26}, "end": {"line": 206, "column": null}}, "27": {"start": {"line": 207, "column": 8}, "end": {"line": 209, "column": null}}, "28": {"start": {"line": 208, "column": 12}, "end": {"line": 208, "column": null}}, "29": {"start": {"line": 210, "column": 8}, "end": {"line": 238, "column": null}}, "30": {"start": {"line": 212, "column": 30}, "end": {"line": 212, "column": null}}, "31": {"start": {"line": 213, "column": 16}, "end": {"line": 215, "column": null}}, "32": {"start": {"line": 213, "column": 41}, "end": {"line": 213, "column": 65}}, "33": {"start": {"line": 214, "column": 20}, "end": {"line": 214, "column": null}}, "34": {"start": {"line": 216, "column": 16}, "end": {"line": 216, "column": null}}, "35": {"start": {"line": 219, "column": 16}, "end": {"line": 221, "column": null}}, "36": {"start": {"line": 220, "column": 20}, "end": {"line": 220, "column": null}}, "37": {"start": {"line": 222, "column": 17}, "end": {"line": 222, "column": null}}, "38": {"start": {"line": 223, "column": 16}, "end": {"line": 223, "column": null}}, "39": {"start": {"line": 226, "column": 16}, "end": {"line": 226, "column": null}}, "40": {"start": {"line": 227, "column": 16}, "end": {"line": 227, "column": null}}, "41": {"start": {"line": 230, "column": 16}, "end": {"line": 232, "column": null}}, "42": {"start": {"line": 231, "column": 20}, "end": {"line": 231, "column": null}}, "43": {"start": {"line": 233, "column": 17}, "end": {"line": 233, "column": null}}, "44": {"start": {"line": 234, "column": 16}, "end": {"line": 234, "column": null}}, "45": {"start": {"line": 237, "column": 16}, "end": {"line": 237, "column": null}}, "46": {"start": {"line": 240, "column": 4}, "end": {"line": 240, "column": null}}, "47": {"start": {"line": 259, "column": 23}, "end": {"line": 259, "column": null}}, "48": {"start": {"line": 260, "column": 25}, "end": {"line": 260, "column": null}}, "49": {"start": {"line": 262, "column": 4}, "end": {"line": 264, "column": null}}, "50": {"start": {"line": 263, "column": 8}, "end": {"line": 263, "column": null}}, "51": {"start": {"line": 265, "column": 19}, "end": {"line": 265, "column": null}}, "52": {"start": {"line": 266, "column": 4}, "end": {"line": 270, "column": null}}, "53": {"start": {"line": 269, "column": 8}, "end": {"line": 269, "column": null}}, "54": {"start": {"line": 274, "column": 24}, "end": {"line": 274, "column": null}}, "55": {"start": {"line": 275, "column": 27}, "end": {"line": 277, "column": null}}, "56": {"start": {"line": 276, "column": 15}, "end": {"line": 276, "column": null}}, "57": {"start": {"line": 278, "column": 4}, "end": {"line": 280, "column": null}}, "58": {"start": {"line": 279, "column": 8}, "end": {"line": 279, "column": null}}, "59": {"start": {"line": 281, "column": 4}, "end": {"line": 296, "column": null}}, "60": {"start": {"line": 290, "column": 25}, "end": {"line": 292, "column": null}}, "61": {"start": {"line": 291, "column": 38}, "end": {"line": 291, "column": 66}}, "62": {"start": {"line": 293, "column": 8}, "end": {"line": 295, "column": null}}, "63": {"start": {"line": 294, "column": 12}, "end": {"line": 294, "column": null}}, "64": {"start": {"line": 297, "column": 26}, "end": {"line": 297, "column": null}}, "65": {"start": {"line": 298, "column": 18}, "end": {"line": 301, "column": null}}, "66": {"start": {"line": 302, "column": 4}, "end": {"line": 304, "column": null}}, "67": {"start": {"line": 303, "column": 8}, "end": {"line": 303, "column": null}}, "68": {"start": {"line": 306, "column": 4}, "end": {"line": 309, "column": null}}, "69": {"start": {"line": 318, "column": 18}, "end": {"line": 318, "column": null}}, "70": {"start": {"line": 320, "column": 4}, "end": {"line": 329, "column": null}}, "71": {"start": {"line": 324, "column": 8}, "end": {"line": 324, "column": null}}, "72": {"start": {"line": 325, "column": 4}, "end": {"line": 329, "column": null}}, "73": {"start": {"line": 326, "column": 8}, "end": {"line": 326, "column": null}}, "74": {"start": {"line": 328, "column": 8}, "end": {"line": 328, "column": null}}, "75": {"start": {"line": 334, "column": 4}, "end": {"line": 361, "column": null}}, "76": {"start": {"line": 375, "column": 22}, "end": {"line": 375, "column": null}}, "77": {"start": {"line": 377, "column": 40}, "end": {"line": 377, "column": null}}, "78": {"start": {"line": 378, "column": 32}, "end": {"line": 378, "column": null}}, "79": {"start": {"line": 379, "column": 48}, "end": {"line": 379, "column": null}}, "80": {"start": {"line": 380, "column": 23}, "end": {"line": 383, "column": null}}, "81": {"start": {"line": 381, "column": 8}, "end": {"line": 381, "column": null}}, "82": {"start": {"line": 382, "column": 8}, "end": {"line": 382, "column": null}}, "83": {"start": {"line": 385, "column": 4}, "end": {"line": 396, "column": null}}, "84": {"start": {"line": 386, "column": 8}, "end": {"line": 388, "column": null}}, "85": {"start": {"line": 387, "column": 12}, "end": {"line": 387, "column": null}}, "86": {"start": {"line": 389, "column": 24}, "end": {"line": 389, "column": null}}, "87": {"start": {"line": 390, "column": 8}, "end": {"line": 395, "column": null}}, "88": {"start": {"line": 391, "column": 12}, "end": {"line": 391, "column": null}}, "89": {"start": {"line": 392, "column": 8}, "end": {"line": 395, "column": null}}, "90": {"start": {"line": 393, "column": 12}, "end": {"line": 393, "column": null}}, "91": {"start": {"line": 394, "column": 12}, "end": {"line": 394, "column": null}}, "92": {"start": {"line": 400, "column": 24}, "end": {"line": 400, "column": null}}, "93": {"start": {"line": 401, "column": 4}, "end": {"line": 405, "column": null}}, "94": {"start": {"line": 402, "column": 8}, "end": {"line": 404, "column": null}}, "95": {"start": {"line": 403, "column": 12}, "end": {"line": 403, "column": null}}, "96": {"start": {"line": 407, "column": 4}, "end": {"line": 411, "column": null}}, "97": {"start": {"line": 444, "column": 16}, "end": {"line": 444, "column": null}}, "98": {"start": {"line": 445, "column": 4}, "end": {"line": 445, "column": null}}, "99": {"start": {"line": 446, "column": 4}, "end": {"line": 448, "column": null}}, "100": {"start": {"line": 447, "column": 8}, "end": {"line": 447, "column": null}}, "101": {"start": {"line": 449, "column": 4}, "end": {"line": 451, "column": null}}, "102": {"start": {"line": 450, "column": 8}, "end": {"line": 450, "column": null}}, "103": {"start": {"line": 452, "column": 4}, "end": {"line": 454, "column": null}}, "104": {"start": {"line": 453, "column": 8}, "end": {"line": 453, "column": null}}, "105": {"start": {"line": 455, "column": 4}, "end": {"line": 457, "column": null}}, "106": {"start": {"line": 456, "column": 8}, "end": {"line": 456, "column": null}}, "107": {"start": {"line": 467, "column": 48}, "end": {"line": 467, "column": null}}, "108": {"start": {"line": 468, "column": 61}, "end": {"line": 468, "column": null}}, "109": {"start": {"line": 469, "column": 61}, "end": {"line": 469, "column": null}}, "110": {"start": {"line": 471, "column": 26}, "end": {"line": 471, "column": null}}, "111": {"start": {"line": 472, "column": 26}, "end": {"line": 472, "column": null}}, "112": {"start": {"line": 473, "column": 33}, "end": {"line": 473, "column": null}}, "113": {"start": {"line": 474, "column": 37}, "end": {"line": 480, "column": null}}, "114": {"start": {"line": 482, "column": 4}, "end": {"line": 502, "column": null}}, "115": {"start": {"line": 483, "column": 8}, "end": {"line": 483, "column": null}}, "116": {"start": {"line": 484, "column": 8}, "end": {"line": 484, "column": null}}, "117": {"start": {"line": 485, "column": 8}, "end": {"line": 497, "column": null}}, "118": {"start": {"line": 487, "column": 16}, "end": {"line": 487, "column": null}}, "119": {"start": {"line": 488, "column": 16}, "end": {"line": 488, "column": null}}, "120": {"start": {"line": 490, "column": 16}, "end": {"line": 490, "column": null}}, "121": {"start": {"line": 491, "column": 29}, "end": {"line": 491, "column": null}}, "122": {"start": {"line": 492, "column": 16}, "end": {"line": 492, "column": null}}, "123": {"start": {"line": 493, "column": 16}, "end": {"line": 493, "column": null}}, "124": {"start": {"line": 496, "column": 16}, "end": {"line": 496, "column": null}}, "125": {"start": {"line": 498, "column": 8}, "end": {"line": 498, "column": null}}, "126": {"start": {"line": 499, "column": 8}, "end": {"line": 501, "column": null}}, "127": {"start": {"line": 500, "column": 12}, "end": {"line": 500, "column": null}}, "128": {"start": {"line": 504, "column": 4}, "end": {"line": 516, "column": null}}, "129": {"start": {"line": 524, "column": 14}, "end": {"line": 524, "column": null}}, "130": {"start": {"line": 525, "column": 4}, "end": {"line": 548, "column": null}}, "131": {"start": {"line": 558, "column": 4}, "end": {"line": 558, "column": null}}, "132": {"start": {"line": 558, "column": 32}, "end": {"line": 558, "column": 65}}, "133": {"start": {"line": 562, "column": 4}, "end": {"line": 562, "column": null}}, "134": {"start": {"line": 566, "column": 4}, "end": {"line": 566, "column": null}}}, "fnMap": {"0": {"name": "isRecord", "decl": {"start": {"line": 128, "column": 9}, "end": {"line": 128, "column": 18}}, "loc": {"start": {"line": 128, "column": 68}, "end": {"line": 130, "column": null}}}, "1": {"name": "asString", "decl": {"start": {"line": 132, "column": 9}, "end": {"line": 132, "column": 18}}, "loc": {"start": {"line": 132, "column": 49}, "end": {"line": 134, "column": null}}}, "2": {"name": "asOptionalNumber", "decl": {"start": {"line": 136, "column": 9}, "end": {"line": 136, "column": 26}}, "loc": {"start": {"line": 136, "column": 57}, "end": {"line": 138, "column": null}}}, "3": {"name": "asBoolean", "decl": {"start": {"line": 140, "column": 9}, "end": {"line": 140, "column": 19}}, "loc": {"start": {"line": 140, "column": 51}, "end": {"line": 142, "column": null}}}, "4": {"name": "percentile", "decl": {"start": {"line": 144, "column": 9}, "end": {"line": 144, "column": 20}}, "loc": {"start": {"line": 144, "column": 66}, "end": {"line": 153, "column": null}}}, "5": {"name": "latencyStats", "decl": {"start": {"line": 155, "column": 9}, "end": {"line": 155, "column": 22}}, "loc": {"start": {"line": 155, "column": 91}, "end": {"line": 168, "column": null}}}, "6": {"name": "(anonymous_6)", "decl": {"start": {"line": 157, "column": 16}, "end": {"line": 157, "column": 17}}, "loc": {"start": {"line": 157, "column": 36}, "end": {"line": 157, "column": 79}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 158, "column": 14}, "end": {"line": 158, "column": 15}}, "loc": {"start": {"line": 158, "column": 24}, "end": {"line": 158, "column": 29}}}, "8": {"name": "humanFromResolution", "decl": {"start": {"line": 170, "column": 9}, "end": {"line": 170, "column": null}}, "loc": {"start": {"line": 173, "column": 67}, "end": {"line": 187, "column": null}}}, "9": {"name": "collectReviewEvents", "decl": {"start": {"line": 199, "column": 9}, "end": {"line": 199, "column": 29}}, "loc": {"start": {"line": 199, "column": 78}, "end": {"line": 241, "column": null}}}, "10": {"name": "(anonymous_10)", "decl": {"start": {"line": 213, "column": 31}, "end": {"line": 213, "column": 32}}, "loc": {"start": {"line": 213, "column": 41}, "end": {"line": 213, "column": 65}}}, "11": {"name": "joinTerminalRequest", "decl": {"start": {"line": 254, "column": 9}, "end": {"line": 254, "column": null}}, "loc": {"start": {"line": 258, "column": 15}, "end": {"line": 310, "column": null}}}, "12": {"name": "(anonymous_12)", "decl": {"start": {"line": 276, "column": 8}, "end": {"line": 276, "column": 9}}, "loc": {"start": {"line": 276, "column": 15}, "end": {"line": 276, "column": null}}}, "13": {"name": "(anonymous_13)", "decl": {"start": {"line": 291, "column": 31}, "end": {"line": 291, "column": 32}}, "loc": {"start": {"line": 291, "column": 38}, "end": {"line": 291, "column": 66}}}, "14": {"name": "buildJoinedRow", "decl": {"start": {"line": 312, "column": 9}, "end": {"line": 312, "column": null}}, "loc": {"start": {"line": 317, "column": 13}, "end": {"line": 362, "column": null}}}, "15": {"name": "analyzeShadowReviewLog", "decl": {"start": {"line": 374, "column": 16}, "end": {"line": 374, "column": 39}}, "loc": {"start": {"line": 374, "column": 86}, "end": {"line": 412, "column": null}}}, "16": {"name": "(anonymous_16)", "decl": {"start": {"line": 380, "column": 23}, "end": {"line": 380, "column": 24}}, "loc": {"start": {"line": 380, "column": 63}, "end": {"line": 383, "column": null}}}, "17": {"name": "tallyAttributable", "decl": {"start": {"line": 443, "column": 9}, "end": {"line": 443, "column": 27}}, "loc": {"start": {"line": 443, "column": 68}, "end": {"line": 458, "column": null}}}, "18": {"name": "tallyJoinedRows", "decl": {"start": {"line": 466, "column": 9}, "end": {"line": 466, "column": 25}}, "loc": {"start": {"line": 466, "column": 67}, "end": {"line": 517, "column": null}}}, "19": {"name": "computeMetrics", "decl": {"start": {"line": 519, "column": 9}, "end": {"line": 519, "column": null}}, "loc": {"start": {"line": 523, "column": 11}, "end": {"line": 549, "column": null}}}, "20": {"name": "unprovenCount", "decl": {"start": {"line": 554, "column": 9}, "end": {"line": 554, "column": 23}}, "loc": {"start": {"line": 554, "column": 61}, "end": {"line": 559, "column": null}}}, "21": {"name": "(anonymous_21)", "decl": {"start": {"line": 558, "column": 25}, "end": {"line": 558, "column": 26}}, "loc": {"start": {"line": 558, "column": 32}, "end": {"line": 558, "column": 65}}}, "22": {"name": "allowPredictions", "decl": {"start": {"line": 561, "column": 9}, "end": {"line": 561, "column": 26}}, "loc": {"start": {"line": 561, "column": 76}, "end": {"line": 563, "column": null}}}, "23": {"name": "hasAllowPrediction", "decl": {"start": {"line": 565, "column": 9}, "end": {"line": 565, "column": 28}}, "loc": {"start": {"line": 565, "column": 79}, "end": {"line": 567, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 129, "column": 11}, "end": {"line": 129, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 129, "column": 11}, "end": {"line": 129, "column": 40}}, {"start": {"line": 129, "column": 40}, "end": {"line": 129, "column": 58}}, {"start": {"line": 129, "column": 58}, "end": {"line": 129, "column": null}}]}, "1": {"loc": {"start": {"line": 133, "column": 11}, "end": {"line": 133, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 133, "column": 39}, "end": {"line": 133, "column": 47}}, {"start": {"line": 133, "column": 47}, "end": {"line": 133, "column": null}}]}, "2": {"loc": {"start": {"line": 137, "column": 11}, "end": {"line": 137, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 137, "column": 65}, "end": {"line": 137, "column": 73}}, {"start": {"line": 137, "column": 73}, "end": {"line": 137, "column": null}}]}, "3": {"loc": {"start": {"line": 137, "column": 11}, "end": {"line": 137, "column": 65}}, "type": "binary-expr", "locations": [{"start": {"line": 137, "column": 11}, "end": {"line": 137, "column": 40}}, {"start": {"line": 137, "column": 40}, "end": {"line": 137, "column": 65}}]}, "4": {"loc": {"start": {"line": 141, "column": 11}, "end": {"line": 141, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 141, "column": 40}, "end": {"line": 141, "column": 48}}, {"start": {"line": 141, "column": 48}, "end": {"line": 141, "column": null}}]}, "5": {"loc": {"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, "type": "if", "locations": [{"start": {"line": 145, "column": 4}, "end": {"line": 147, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 157, "column": 36}, "end": {"line": 157, "column": 79}}, "type": "binary-expr", "locations": [{"start": {"line": 157, "column": 36}, "end": {"line": 157, "column": 61}}, {"start": {"line": 157, "column": 61}, "end": {"line": 157, "column": 79}}]}, "7": {"loc": {"start": {"line": 159, "column": 4}, "end": {"line": 161, "column": null}}, "type": "if", "locations": [{"start": {"line": 159, "column": 4}, "end": {"line": 161, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 165, "column": 13}, "end": {"line": 165, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 165, "column": 35}, "end": {"line": 165, "column": 76}}, {"start": {"line": 165, "column": 76}, "end": {"line": 165, "column": null}}]}, "9": {"loc": {"start": {"line": 175, "column": 4}, "end": {"line": 186, "column": null}}, "type": "switch", "locations": [{"start": {"line": 176, "column": 8}, "end": {"line": 176, "column": null}}, {"start": {"line": 177, "column": 8}, "end": {"line": 177, "column": null}}, {"start": {"line": 178, "column": 8}, "end": {"line": 179, "column": null}}, {"start": {"line": 180, "column": 8}, "end": {"line": 180, "column": null}}, {"start": {"line": 182, "column": 8}, "end": {"line": 183, "column": null}}, {"start": {"line": 184, "column": 8}, "end": {"line": 185, "column": null}}]}, "10": {"loc": {"start": {"line": 207, "column": 8}, "end": {"line": 209, "column": null}}, "type": "if", "locations": [{"start": {"line": 207, "column": 8}, "end": {"line": 209, "column": null}}, {"start": {}, "end": {}}]}, "11": {"loc": {"start": {"line": 210, "column": 8}, "end": {"line": 238, "column": null}}, "type": "switch", "locations": [{"start": {"line": 211, "column": 12}, "end": {"line": 217, "column": null}}, {"start": {"line": 218, "column": 12}, "end": {"line": 223, "column": null}}, {"start": {"line": 224, "column": 12}, "end": {"line": 224, "column": null}}, {"start": {"line": 225, "column": 12}, "end": {"line": 227, "column": null}}, {"start": {"line": 228, "column": 12}, "end": {"line": 228, "column": null}}, {"start": {"line": 229, "column": 12}, "end": {"line": 235, "column": null}}, {"start": {"line": 236, "column": 12}, "end": {"line": 237, "column": null}}]}, "12": {"loc": {"start": {"line": 212, "column": 30}, "end": {"line": 212, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 212, "column": 57}, "end": {"line": 212, "column": 69}}, {"start": {"line": 212, "column": 69}, "end": {"line": 212, "column": null}}]}, "13": {"loc": {"start": {"line": 213, "column": 16}, "end": {"line": 215, "column": null}}, "type": "if", "locations": [{"start": {"line": 213, "column": 16}, "end": {"line": 215, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 219, "column": 16}, "end": {"line": 221, "column": null}}, "type": "if", "locations": [{"start": {"line": 219, "column": 16}, "end": {"line": 221, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 230, "column": 16}, "end": {"line": 232, "column": null}}, "type": "if", "locations": [{"start": {"line": 230, "column": 16}, "end": {"line": 232, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 259, "column": 23}, "end": {"line": 259, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 259, "column": 23}, "end": {"line": 259, "column": 59}}, {"start": {"line": 259, "column": 59}, "end": {"line": 259, "column": null}}]}, "17": {"loc": {"start": {"line": 260, "column": 25}, "end": {"line": 260, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 260, "column": 25}, "end": {"line": 260, "column": 62}}, {"start": {"line": 260, "column": 62}, "end": {"line": 260, "column": null}}]}, "18": {"loc": {"start": {"line": 262, "column": 4}, "end": {"line": 264, "column": null}}, "type": "if", "locations": [{"start": {"line": 262, "column": 4}, "end": {"line": 264, "column": null}}, {"start": {}, "end": {}}]}, "19": {"loc": {"start": {"line": 266, "column": 4}, "end": {"line": 270, "column": null}}, "type": "if", "locations": [{"start": {"line": 266, "column": 4}, "end": {"line": 270, "column": null}}, {"start": {}, "end": {}}]}, "20": {"loc": {"start": {"line": 278, "column": 4}, "end": {"line": 280, "column": null}}, "type": "if", "locations": [{"start": {"line": 278, "column": 4}, "end": {"line": 280, "column": null}}, {"start": {}, "end": {}}]}, "21": {"loc": {"start": {"line": 281, "column": 4}, "end": {"line": 296, "column": null}}, "type": "if", "locations": [{"start": {"line": 281, "column": 4}, "end": {"line": 296, "column": null}}, {"start": {}, "end": {}}]}, "22": {"loc": {"start": {"line": 291, "column": 38}, "end": {"line": 291, "column": 66}}, "type": "binary-expr", "locations": [{"start": {"line": 291, "column": 38}, "end": {"line": 291, "column": 64}}, {"start": {"line": 291, "column": 64}, "end": {"line": 291, "column": 66}}]}, "23": {"loc": {"start": {"line": 293, "column": 8}, "end": {"line": 295, "column": null}}, "type": "if", "locations": [{"start": {"line": 293, "column": 8}, "end": {"line": 295, "column": null}}, {"start": {}, "end": {}}]}, "24": {"loc": {"start": {"line": 299, "column": 8}, "end": {"line": 299, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 299, "column": 8}, "end": {"line": 299, "column": 46}}, {"start": {"line": 299, "column": 46}, "end": {"line": 299, "column": null}}]}, "25": {"loc": {"start": {"line": 302, "column": 4}, "end": {"line": 304, "column": null}}, "type": "if", "locations": [{"start": {"line": 302, "column": 4}, "end": {"line": 304, "column": null}}, {"start": {}, "end": {}}]}, "26": {"loc": {"start": {"line": 320, "column": 4}, "end": {"line": 329, "column": null}}, "type": "if", "locations": [{"start": {"line": 320, "column": 4}, "end": {"line": 329, "column": null}}, {"start": {"line": 325, "column": 4}, "end": {"line": 329, "column": null}}]}, "27": {"loc": {"start": {"line": 321, "column": 8}, "end": {"line": 322, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 321, "column": 8}, "end": {"line": 321, "column": null}}, {"start": {"line": 322, "column": 8}, "end": {"line": 322, "column": null}}]}, "28": {"loc": {"start": {"line": 325, "column": 4}, "end": {"line": 329, "column": null}}, "type": "if", "locations": [{"start": {"line": 325, "column": 4}, "end": {"line": 329, "column": null}}, {"start": {"line": 327, "column": 11}, "end": {"line": 329, "column": null}}]}, "29": {"loc": {"start": {"line": 338, "column": 12}, "end": {"line": 342, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 341, "column": 18}, "end": {"line": 341, "column": null}}, {"start": {"line": 342, "column": 18}, "end": {"line": 342, "column": null}}]}, "30": {"loc": {"start": {"line": 338, "column": 12}, "end": {"line": 340, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 338, "column": 12}, "end": {"line": 338, "column": null}}, {"start": {"line": 339, "column": 16}, "end": {"line": 339, "column": null}}, {"start": {"line": 340, "column": 16}, "end": {"line": 340, "column": null}}]}, "31": {"loc": {"start": {"line": 344, "column": 12}, "end": {"line": 348, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 347, "column": 18}, "end": {"line": 347, "column": null}}, {"start": {"line": 348, "column": 18}, "end": {"line": 348, "column": null}}]}, "32": {"loc": {"start": {"line": 344, "column": 12}, "end": {"line": 346, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 344, "column": 12}, "end": {"line": 344, "column": null}}, {"start": {"line": 345, "column": 16}, "end": {"line": 345, "column": null}}, {"start": {"line": 346, "column": 16}, "end": {"line": 346, "column": null}}]}, "33": {"loc": {"start": {"line": 350, "column": 21}, "end": {"line": 350, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 350, "column": 21}, "end": {"line": 350, "column": 54}}, {"start": {"line": 350, "column": 54}, "end": {"line": 350, "column": null}}]}, "34": {"loc": {"start": {"line": 381, "column": 33}, "end": {"line": 381, "column": 63}}, "type": "binary-expr", "locations": [{"start": {"line": 381, "column": 33}, "end": {"line": 381, "column": 58}}, {"start": {"line": 381, "column": 58}, "end": {"line": 381, "column": 63}}]}, "35": {"loc": {"start": {"line": 386, "column": 8}, "end": {"line": 388, "column": null}}, "type": "if", "locations": [{"start": {"line": 386, "column": 8}, "end": {"line": 388, "column": null}}, {"start": {}, "end": {}}]}, "36": {"loc": {"start": {"line": 390, "column": 8}, "end": {"line": 395, "column": null}}, "type": "if", "locations": [{"start": {"line": 390, "column": 8}, "end": {"line": 395, "column": null}}, {"start": {"line": 392, "column": 8}, "end": {"line": 395, "column": null}}]}, "37": {"loc": {"start": {"line": 392, "column": 8}, "end": {"line": 395, "column": null}}, "type": "if", "locations": [{"start": {"line": 392, "column": 8}, "end": {"line": 395, "column": null}}, {"start": {}, "end": {}}]}, "38": {"loc": {"start": {"line": 402, "column": 8}, "end": {"line": 404, "column": null}}, "type": "if", "locations": [{"start": {"line": 402, "column": 8}, "end": {"line": 404, "column": null}}, {"start": {}, "end": {}}]}, "39": {"loc": {"start": {"line": 402, "column": 12}, "end": {"line": 402, "column": 84}}, "type": "binary-expr", "locations": [{"start": {"line": 402, "column": 12}, "end": {"line": 402, "column": 50}}, {"start": {"line": 402, "column": 50}, "end": {"line": 402, "column": 84}}]}, "40": {"loc": {"start": {"line": 444, "column": 19}, "end": {"line": 444, "column": 40}}, "type": "binary-expr", "locations": [{"start": {"line": 444, "column": 19}, "end": {"line": 444, "column": 34}}, {"start": {"line": 444, "column": 34}, "end": {"line": 444, "column": 40}}]}, "41": {"loc": {"start": {"line": 445, "column": 21}, "end": {"line": 445, "column": 43}}, "type": "binary-expr", "locations": [{"start": {"line": 445, "column": 21}, "end": {"line": 445, "column": 38}}, {"start": {"line": 445, "column": 38}, "end": {"line": 445, "column": 43}}]}, "42": {"loc": {"start": {"line": 446, "column": 4}, "end": {"line": 448, "column": null}}, "type": "if", "locations": [{"start": {"line": 446, "column": 4}, "end": {"line": 448, "column": null}}, {"start": {}, "end": {}}]}, "43": {"loc": {"start": {"line": 449, "column": 4}, "end": {"line": 451, "column": null}}, "type": "if", "locations": [{"start": {"line": 449, "column": 4}, "end": {"line": 451, "column": null}}, {"start": {}, "end": {}}]}, "44": {"loc": {"start": {"line": 449, "column": 8}, "end": {"line": 449, "column": 66}}, "type": "binary-expr", "locations": [{"start": {"line": 449, "column": 8}, "end": {"line": 449, "column": 35}}, {"start": {"line": 449, "column": 35}, "end": {"line": 449, "column": 66}}]}, "45": {"loc": {"start": {"line": 452, "column": 4}, "end": {"line": 454, "column": null}}, "type": "if", "locations": [{"start": {"line": 452, "column": 4}, "end": {"line": 454, "column": null}}, {"start": {}, "end": {}}]}, "46": {"loc": {"start": {"line": 452, "column": 8}, "end": {"line": 452, "column": 66}}, "type": "binary-expr", "locations": [{"start": {"line": 452, "column": 8}, "end": {"line": 452, "column": 34}}, {"start": {"line": 452, "column": 34}, "end": {"line": 452, "column": 66}}]}, "47": {"loc": {"start": {"line": 455, "column": 4}, "end": {"line": 457, "column": null}}, "type": "if", "locations": [{"start": {"line": 455, "column": 4}, "end": {"line": 457, "column": null}}, {"start": {}, "end": {}}]}, "48": {"loc": {"start": {"line": 455, "column": 8}, "end": {"line": 455, "column": 67}}, "type": "binary-expr", "locations": [{"start": {"line": 455, "column": 8}, "end": {"line": 455, "column": 35}}, {"start": {"line": 455, "column": 35}, "end": {"line": 455, "column": 67}}]}, "49": {"loc": {"start": {"line": 485, "column": 8}, "end": {"line": 497, "column": null}}, "type": "switch", "locations": [{"start": {"line": 486, "column": 12}, "end": {"line": 488, "column": null}}, {"start": {"line": 489, "column": 12}, "end": {"line": 494, "column": null}}, {"start": {"line": 495, "column": 12}, "end": {"line": 496, "column": null}}]}, "50": {"loc": {"start": {"line": 491, "column": 29}, "end": {"line": 491, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 491, "column": 29}, "end": {"line": 491, "column": 41}}, {"start": {"line": 491, "column": 41}, "end": {"line": 491, "column": null}}]}, "51": {"loc": {"start": {"line": 492, "column": 37}, "end": {"line": 492, "column": 63}}, "type": "binary-expr", "locations": [{"start": {"line": 492, "column": 37}, "end": {"line": 492, "column": 58}}, {"start": {"line": 492, "column": 58}, "end": {"line": 492, "column": 63}}]}, "52": {"loc": {"start": {"line": 499, "column": 8}, "end": {"line": 501, "column": null}}, "type": "if", "locations": [{"start": {"line": 499, "column": 8}, "end": {"line": 501, "column": null}}, {"start": {}, "end": {}}]}, "53": {"loc": {"start": {"line": 529, "column": 45}, "end": {"line": 529, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 529, "column": 45}, "end": {"line": 529, "column": 50}}, {"start": {"line": 529, "column": 50}, "end": {"line": 529, "column": null}}]}, "54": {"loc": {"start": {"line": 530, "column": 70}, "end": {"line": 530, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 530, "column": 70}, "end": {"line": 530, "column": 75}}, {"start": {"line": 530, "column": 75}, "end": {"line": 530, "column": null}}]}, "55": {"loc": {"start": {"line": 531, "column": 47}, "end": {"line": 531, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 531, "column": 47}, "end": {"line": 531, "column": 52}}, {"start": {"line": 531, "column": 52}, "end": {"line": 531, "column": null}}]}, "56": {"loc": {"start": {"line": 534, "column": 24}, "end": {"line": 536, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 535, "column": 14}, "end": {"line": 535, "column": null}}, {"start": {"line": 536, "column": 14}, "end": {"line": 536, "column": null}}]}, "57": {"loc": {"start": {"line": 534, "column": 24}, "end": {"line": 534, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 534, "column": 24}, "end": {"line": 534, "column": 45}}, {"start": {"line": 534, "column": 45}, "end": {"line": 534, "column": null}}]}, "58": {"loc": {"start": {"line": 540, "column": 12}, "end": {"line": 542, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 540, "column": 36}, "end": {"line": 541, "column": null}}, {"start": {"line": 542, "column": 18}, "end": {"line": 542, "column": null}}]}, "59": {"loc": {"start": {"line": 562, "column": 12}, "end": {"line": 562, "column": 43}}, "type": "binary-expr", "locations": [{"start": {"line": 562, "column": 12}, "end": {"line": 562, "column": 37}}, {"start": {"line": 562, "column": 37}, "end": {"line": 562, "column": 43}}]}, "60": {"loc": {"start": {"line": 562, "column": 43}, "end": {"line": 562, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 562, "column": 43}, "end": {"line": 562, "column": 67}}, {"start": {"line": 562, "column": 67}, "end": {"line": 562, "column": null}}]}}, "s": {"0": 2, "1": 2, "2": 0, "3": 182, "4": 70, "5": 14, "6": 56, "7": 8, "8": 48, "9": 48, "10": 46, "11": 28, "12": 0, "13": 46, "14": 18, "15": 28, "16": 15, "17": 15, "18": 12, "19": 2, "20": 1, "21": 23, "22": 23, "23": 23, "24": 23, "25": 23, "26": 78, "27": 78, "28": 0, "29": 78, "30": 20, "31": 20, "32": 20, "33": 20, "34": 20, "35": 22, "36": 20, "37": 22, "38": 22, "39": 2, "40": 2, "41": 21, "42": 19, "43": 21, "44": 21, "45": 13, "46": 23, "47": 19, "48": 19, "49": 19, "50": 2, "51": 17, "52": 17, "53": 0, "54": 17, "55": 17, "56": 19, "57": 17, "58": 1, "59": 16, "60": 2, "61": 4, "62": 2, "63": 1, "64": 15, "65": 15, "66": 15, "67": 1, "68": 14, "69": 14, "70": 14, "71": 2, "72": 12, "73": 1, "74": 11, "75": 14, "76": 23, "77": 23, "78": 23, "79": 23, "80": 23, "81": 6, "82": 6, "83": 23, "84": 19, "85": 0, "86": 19, "87": 19, "88": 5, "89": 14, "90": 14, "91": 14, "92": 23, "93": 23, "94": 20, "95": 1, "96": 23, "97": 10, "98": 10, "99": 10, "100": 8, "101": 10, "102": 2, "103": 10, "104": 1, "105": 10, "106": 2, "107": 23, "108": 23, "109": 23, "110": 23, "111": 23, "112": 23, "113": 23, "114": 23, "115": 14, "116": 14, "117": 14, "118": 2, "119": 2, "120": 1, "121": 1, "122": 1, "123": 1, "124": 11, "125": 11, "126": 11, "127": 10, "128": 23, "129": 23, "130": 23, "131": 23, "132": 14, "133": 28, "134": 21}, "f": {"0": 0, "1": 182, "2": 70, "3": 14, "4": 56, "5": 46, "6": 28, "7": 0, "8": 15, "9": 23, "10": 20, "11": 19, "12": 19, "13": 4, "14": 14, "15": 23, "16": 6, "17": 10, "18": 23, "19": 23, "20": 23, "21": 14, "22": 28, "23": 21}, "b": {"0": [0, 0, 0], "1": [101, 81], "2": [24, 46], "3": [70, 24], "4": [12, 2], "5": [8, 48], "6": [28, 24], "7": [18, 28], "8": [24, 4], "9": [10, 12, 12, 1, 2, 1], "10": [0, 78], "11": [20, 22, 2, 2, 20, 21, 13], "12": [20, 0], "13": [20, 0], "14": [20, 2], "15": [19, 2], "16": [19, 0], "17": [19, 0], "18": [2, 17], "19": [0, 17], "20": [1, 16], "21": [2, 14], "22": [4, 0], "23": [1, 1], "24": [15, 0], "25": [1, 14], "26": [2, 12], "27": [14, 12], "28": [1, 11], "29": [14, 0], "30": [14, 3, 1], "31": [11, 3], "32": [14, 6, 5], "33": [14, 2], "34": [6, 6], "35": [0, 19], "36": [5, 14], "37": [14, 0], "38": [1, 19], "39": [20, 1], "40": [10, 0], "41": [10, 10], "42": [8, 2], "43": [2, 8], "44": [10, 7], "45": [1, 9], "46": [10, 1], "47": [2, 8], "48": [10, 2], "49": [2, 1, 11], "50": [1, 0], "51": [1, 1], "52": [10, 1], "53": [23, 3], "54": [23, 3], "55": [23, 3], "56": [7, 16], "57": [23, 21], "58": [8, 15], "59": [28, 18], "60": [28, 26]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/analyzer/cli.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/src/analyzer/cli.ts", "statementMap": {"0": {"start": {"line": 14, "column": 14}, "end": {"line": 14, "column": null}}, "1": {"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, "2": {"start": {"line": 42, "column": 8}, "end": {"line": 42, "column": null}}, "3": {"start": {"line": 44, "column": 17}, "end": {"line": 44, "column": null}}, "4": {"start": {"line": 45, "column": 4}, "end": {"line": 47, "column": null}}, "5": {"start": {"line": 46, "column": 8}, "end": {"line": 46, "column": null}}, "6": {"start": {"line": 48, "column": 4}, "end": {"line": 48, "column": null}}, "7": {"start": {"line": 53, "column": 17}, "end": {"line": 53, "column": null}}, "8": {"start": {"line": 55, "column": 29}, "end": {"line": 55, "column": null}}, "9": {"start": {"line": 56, "column": 30}, "end": {"line": 56, "column": null}}, "10": {"start": {"line": 57, "column": 31}, "end": {"line": 57, "column": null}}, "11": {"start": {"line": 58, "column": 4}, "end": {"line": 92, "column": null}}, "12": {"start": {"line": 58, "column": 17}, "end": {"line": 58, "column": 20}}, "13": {"start": {"line": 59, "column": 20}, "end": {"line": 59, "column": null}}, "14": {"start": {"line": 60, "column": 8}, "end": {"line": 62, "column": null}}, "15": {"start": {"line": 61, "column": 12}, "end": {"line": 61, "column": null}}, "16": {"start": {"line": 63, "column": 8}, "end": {"line": 71, "column": null}}, "17": {"start": {"line": 64, "column": 26}, "end": {"line": 64, "column": null}}, "18": {"start": {"line": 65, "column": 12}, "end": {"line": 67, "column": null}}, "19": {"start": {"line": 66, "column": 16}, "end": {"line": 66, "column": null}}, "20": {"start": {"line": 68, "column": 12}, "end": {"line": 68, "column": null}}, "21": {"start": {"line": 69, "column": 12}, "end": {"line": 69, "column": null}}, "22": {"start": {"line": 70, "column": 12}, "end": {"line": 70, "column": null}}, "23": {"start": {"line": 72, "column": 8}, "end": {"line": 84, "column": null}}, "24": {"start": {"line": 73, "column": 27}, "end": {"line": 73, "column": null}}, "25": {"start": {"line": 74, "column": 12}, "end": {"line": 76, "column": null}}, "26": {"start": {"line": 75, "column": 16}, "end": {"line": 75, "column": null}}, "27": {"start": {"line": 77, "column": 12}, "end": {"line": 81, "column": null}}, "28": {"start": {"line": 78, "column": 16}, "end": {"line": 78, "column": null}}, "29": {"start": {"line": 80, "column": 16}, "end": {"line": 80, "column": null}}, "30": {"start": {"line": 82, "column": 12}, "end": {"line": 82, "column": null}}, "31": {"start": {"line": 83, "column": 12}, "end": {"line": 83, "column": null}}, "32": {"start": {"line": 85, "column": 8}, "end": {"line": 87, "column": null}}, "33": {"start": {"line": 86, "column": 12}, "end": {"line": 86, "column": null}}, "34": {"start": {"line": 88, "column": 8}, "end": {"line": 90, "column": null}}, "35": {"start": {"line": 89, "column": 12}, "end": {"line": 89, "column": null}}, "36": {"start": {"line": 91, "column": 8}, "end": {"line": 91, "column": null}}, "37": {"start": {"line": 93, "column": 4}, "end": {"line": 95, "column": null}}, "38": {"start": {"line": 94, "column": 8}, "end": {"line": 94, "column": null}}, "39": {"start": {"line": 96, "column": 4}, "end": {"line": 96, "column": null}}, "40": {"start": {"line": 100, "column": 4}, "end": {"line": 102, "column": null}}, "41": {"start": {"line": 101, "column": 8}, "end": {"line": 101, "column": null}}, "42": {"start": {"line": 103, "column": 4}, "end": {"line": 110, "column": null}}, "43": {"start": {"line": 104, "column": 8}, "end": {"line": 104, "column": null}}, "44": {"start": {"line": 106, "column": 8}, "end": {"line": 108, "column": null}}, "45": {"start": {"line": 109, "column": 8}, "end": {"line": 109, "column": null}}, "46": {"start": {"line": 114, "column": 4}, "end": {"line": 116, "column": null}}, "47": {"start": {"line": 115, "column": 8}, "end": {"line": 115, "column": null}}, "48": {"start": {"line": 117, "column": 4}, "end": {"line": 117, "column": null}}, "49": {"start": {"line": 126, "column": 4}, "end": {"line": 128, "column": null}}, "50": {"start": {"line": 127, "column": 8}, "end": {"line": 127, "column": null}}, "51": {"start": {"line": 129, "column": 4}, "end": {"line": 129, "column": null}}, "52": {"start": {"line": 135, "column": 4}, "end": {"line": 142, "column": null}}, "53": {"start": {"line": 136, "column": 8}, "end": {"line": 136, "column": null}}, "54": {"start": {"line": 138, "column": 8}, "end": {"line": 140, "column": null}}, "55": {"start": {"line": 141, "column": 8}, "end": {"line": 141, "column": null}}, "56": {"start": {"line": 143, "column": 4}, "end": {"line": 146, "column": null}}, "57": {"start": {"line": 145, "column": 30}, "end": {"line": 145, "column": 56}}, "58": {"start": {"line": 146, "column": 45}, "end": {"line": 146, "column": 57}}, "59": {"start": {"line": 157, "column": 15}, "end": {"line": 157, "column": null}}, "60": {"start": {"line": 158, "column": 4}, "end": {"line": 160, "column": null}}, "61": {"start": {"line": 159, "column": 8}, "end": {"line": 159, "column": null}}, "62": {"start": {"line": 161, "column": 17}, "end": {"line": 161, "column": null}}, "63": {"start": {"line": 162, "column": 4}, "end": {"line": 164, "column": null}}, "64": {"start": {"line": 163, "column": 8}, "end": {"line": 163, "column": null}}, "65": {"start": {"line": 165, "column": 4}, "end": {"line": 167, "column": null}}, "66": {"start": {"line": 166, "column": 8}, "end": {"line": 166, "column": null}}, "67": {"start": {"line": 168, "column": 4}, "end": {"line": 168, "column": null}}, "68": {"start": {"line": 179, "column": 4}, "end": {"line": 186, "column": null}}, "69": {"start": {"line": 180, "column": 25}, "end": {"line": 180, "column": 63}}, "70": {"start": {"line": 181, "column": 25}, "end": {"line": 181, "column": 50}}, "71": {"start": {"line": 182, "column": 23}, "end": {"line": 186, "column": 25}}, "72": {"start": {"line": 190, "column": 19}, "end": {"line": 190, "column": null}}, "73": {"start": {"line": 191, "column": 4}, "end": {"line": 194, "column": null}}, "74": {"start": {"line": 192, "column": 8}, "end": {"line": 192, "column": null}}, "75": {"start": {"line": 193, "column": 8}, "end": {"line": 193, "column": null}}, "76": {"start": {"line": 196, "column": 31}, "end": {"line": 196, "column": null}}, "77": {"start": {"line": 197, "column": 19}, "end": {"line": 199, "column": null}}, "78": {"start": {"line": 198, "column": 8}, "end": {"line": 198, "column": null}}, "79": {"start": {"line": 200, "column": 17}, "end": {"line": 200, "column": null}}, "80": {"start": {"line": 201, "column": 4}, "end": {"line": 207, "column": null}}, "81": {"start": {"line": 202, "column": 30}, "end": {"line": 202, "column": null}}, "82": {"start": {"line": 203, "column": 8}, "end": {"line": 206, "column": null}}, "83": {"start": {"line": 204, "column": 38}, "end": {"line": 204, "column": 79}}, "84": {"start": {"line": 209, "column": 37}, "end": {"line": 209, "column": null}}, "85": {"start": {"line": 210, "column": 4}, "end": {"line": 210, "column": null}}, "86": {"start": {"line": 218, "column": 16}, "end": {"line": 218, "column": null}}, "87": {"start": {"line": 220, "column": 4}, "end": {"line": 220, "column": null}}, "88": {"start": {"line": 221, "column": 4}, "end": {"line": 221, "column": null}}, "89": {"start": {"line": 222, "column": 4}, "end": {"line": 222, "column": null}}, "90": {"start": {"line": 223, "column": 4}, "end": {"line": 223, "column": null}}, "91": {"start": {"line": 224, "column": 4}, "end": {"line": 226, "column": null}}, "92": {"start": {"line": 225, "column": 8}, "end": {"line": 225, "column": null}}, "93": {"start": {"line": 227, "column": 4}, "end": {"line": 227, "column": null}}, "94": {"start": {"line": 229, "column": 4}, "end": {"line": 229, "column": null}}, "95": {"start": {"line": 230, "column": 4}, "end": {"line": 230, "column": null}}, "96": {"start": {"line": 231, "column": 4}, "end": {"line": 231, "column": null}}, "97": {"start": {"line": 233, "column": 4}, "end": {"line": 233, "column": null}}, "98": {"start": {"line": 234, "column": 4}, "end": {"line": 234, "column": null}}, "99": {"start": {"line": 235, "column": 4}, "end": {"line": 235, "column": null}}, "100": {"start": {"line": 237, "column": 30}, "end": {"line": 239, "column": null}}, "101": {"start": {"line": 238, "column": 22}, "end": {"line": 238, "column": null}}, "102": {"start": {"line": 240, "column": 4}, "end": {"line": 246, "column": null}}, "103": {"start": {"line": 241, "column": 8}, "end": {"line": 241, "column": null}}, "104": {"start": {"line": 242, "column": 8}, "end": {"line": 244, "column": null}}, "105": {"start": {"line": 243, "column": 12}, "end": {"line": 243, "column": null}}, "106": {"start": {"line": 245, "column": 8}, "end": {"line": 245, "column": null}}, "107": {"start": {"line": 248, "column": 4}, "end": {"line": 248, "column": null}}, "108": {"start": {"line": 249, "column": 17}, "end": {"line": 249, "column": null}}, "109": {"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, "110": {"start": {"line": 251, "column": 8}, "end": {"line": 251, "column": null}}, "111": {"start": {"line": 253, "column": 4}, "end": {"line": 255, "column": null}}, "112": {"start": {"line": 254, "column": 8}, "end": {"line": 254, "column": null}}, "113": {"start": {"line": 256, "column": 4}, "end": {"line": 256, "column": null}}, "114": {"start": {"line": 258, "column": 4}, "end": {"line": 258, "column": null}}, "115": {"start": {"line": 259, "column": 4}, "end": {"line": 259, "column": null}}, "116": {"start": {"line": 260, "column": 4}, "end": {"line": 262, "column": null}}, "117": {"start": {"line": 264, "column": 4}, "end": {"line": 264, "column": null}}, "118": {"start": {"line": 265, "column": 4}, "end": {"line": 265, "column": null}}, "119": {"start": {"line": 266, "column": 18}, "end": {"line": 266, "column": null}}, "120": {"start": {"line": 267, "column": 4}, "end": {"line": 269, "column": null}}, "121": {"start": {"line": 268, "column": 8}, "end": {"line": 268, "column": null}}, "122": {"start": {"line": 270, "column": 4}, "end": {"line": 270, "column": null}}, "123": {"start": {"line": 272, "column": 4}, "end": {"line": 272, "column": null}}, "124": {"start": {"line": 273, "column": 4}, "end": {"line": 273, "column": null}}, "125": {"start": {"line": 278, "column": 0}, "end": {"line": 283, "column": null}}, "126": {"start": {"line": 282, "column": 4}, "end": {"line": 282, "column": null}}}, "fnMap": {"0": {"name": "parseTimestampOption", "decl": {"start": {"line": 37, "column": 16}, "end": {"line": 37, "column": null}}, "loc": {"start": {"line": 40, "column": 38}, "end": {"line": 49, "column": null}}}, "1": {"name": "parseArgs", "decl": {"start": {"line": 52, "column": 16}, "end": {"line": 52, "column": 26}}, "loc": {"start": {"line": 52, "column": 83}, "end": {"line": 97, "column": null}}}, "2": {"name": "parseLine", "decl": {"start": {"line": 99, "column": 9}, "end": {"line": 99, "column": 19}}, "loc": {"start": {"line": 99, "column": 69}, "end": {"line": 111, "column": null}}}, "3": {"name": "fmtRate", "decl": {"start": {"line": 113, "column": 9}, "end": {"line": 113, "column": 17}}, "loc": {"start": {"line": 113, "column": 47}, "end": {"line": 118, "column": null}}}, "4": {"name": "fmtLatency", "decl": {"start": {"line": 120, "column": 9}, "end": {"line": 120, "column": 20}}, "loc": {"start": {"line": 125, "column": 18}, "end": {"line": 130, "column": null}}}, "5": {"name": "loadReviewEvents", "decl": {"start": {"line": 133, "column": 9}, "end": {"line": 133, "column": 26}}, "loc": {"start": {"line": 133, "column": 55}, "end": {"line": 147, "column": null}}}, "6": {"name": "(anonymous_6)", "decl": {"start": {"line": 145, "column": 13}, "end": {"line": 145, "column": 14}}, "loc": {"start": {"line": 145, "column": 30}, "end": {"line": 145, "column": 56}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 146, "column": 16}, "end": {"line": 146, "column": 17}}, "loc": {"start": {"line": 146, "column": 45}, "end": {"line": 146, "column": 57}}}, "8": {"name": "withinWindow", "decl": {"start": {"line": 156, "column": 16}, "end": {"line": 156, "column": 29}}, "loc": {"start": {"line": 156, "column": 76}, "end": {"line": 169, "column": null}}}, "9": {"name": "loadAuditEnrolled", "decl": {"start": {"line": 178, "column": 9}, "end": {"line": 178, "column": 27}}, "loc": {"start": {"line": 178, "column": 81}, "end": {"line": 187, "column": null}}}, "10": {"name": "(anonymous_10)", "decl": {"start": {"line": 180, "column": 16}, "end": {"line": 180, "column": 17}}, "loc": {"start": {"line": 180, "column": 25}, "end": {"line": 180, "column": 63}}}, "11": {"name": "(anonymous_11)", "decl": {"start": {"line": 181, "column": 16}, "end": {"line": 181, "column": 17}}, "loc": {"start": {"line": 181, "column": 25}, "end": {"line": 181, "column": 50}}}, "12": {"name": "(anonymous_12)", "decl": {"start": {"line": 182, "column": 13}, "end": {"line": 182, "column": 14}}, "loc": {"start": {"line": 182, "column": 23}, "end": {"line": 186, "column": 25}}}, "13": {"name": "main", "decl": {"start": {"line": 189, "column": 9}, "end": {"line": 189, "column": 22}}, "loc": {"start": {"line": 189, "column": 22}, "end": {"line": 211, "column": null}}}, "14": {"name": "(anonymous_14)", "decl": {"start": {"line": 197, "column": 56}, "end": {"line": 197, "column": 57}}, "loc": {"start": {"line": 198, "column": 8}, "end": {"line": 198, "column": null}}}, "15": {"name": "(anonymous_15)", "decl": {"start": {"line": 204, "column": 29}, "end": {"line": 204, "column": 30}}, "loc": {"start": {"line": 204, "column": 38}, "end": {"line": 204, "column": 79}}}, "16": {"name": "printReport", "decl": {"start": {"line": 213, "column": 16}, "end": {"line": 213, "column": null}}, "loc": {"start": {"line": 217, "column": 8}, "end": {"line": 274, "column": null}}}, "17": {"name": "(anonymous_17)", "decl": {"start": {"line": 238, "column": 8}, "end": {"line": 238, "column": 9}}, "loc": {"start": {"line": 238, "column": 22}, "end": {"line": 238, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, "type": "if", "locations": [{"start": {"line": 41, "column": 4}, "end": {"line": 43, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 45, "column": 4}, "end": {"line": 47, "column": null}}, "type": "if", "locations": [{"start": {"line": 45, "column": 4}, "end": {"line": 47, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 60, "column": 8}, "end": {"line": 62, "column": null}}, "type": "if", "locations": [{"start": {"line": 60, "column": 8}, "end": {"line": 62, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 60, "column": 12}, "end": {"line": 60, "column": 46}}, "type": "binary-expr", "locations": [{"start": {"line": 60, "column": 12}, "end": {"line": 60, "column": 32}}, {"start": {"line": 60, "column": 32}, "end": {"line": 60, "column": 46}}]}, "4": {"loc": {"start": {"line": 63, "column": 8}, "end": {"line": 71, "column": null}}, "type": "if", "locations": [{"start": {"line": 63, "column": 8}, "end": {"line": 71, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 65, "column": 12}, "end": {"line": 67, "column": null}}, "type": "if", "locations": [{"start": {"line": 65, "column": 12}, "end": {"line": 67, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 72, "column": 8}, "end": {"line": 84, "column": null}}, "type": "if", "locations": [{"start": {"line": 72, "column": 8}, "end": {"line": 84, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 72, "column": 12}, "end": {"line": 72, "column": 53}}, "type": "binary-expr", "locations": [{"start": {"line": 72, "column": 12}, "end": {"line": 72, "column": 33}}, {"start": {"line": 72, "column": 33}, "end": {"line": 72, "column": 53}}]}, "8": {"loc": {"start": {"line": 74, "column": 12}, "end": {"line": 76, "column": null}}, "type": "if", "locations": [{"start": {"line": 74, "column": 12}, "end": {"line": 76, "column": null}}, {"start": {}, "end": {}}]}, "9": {"loc": {"start": {"line": 77, "column": 12}, "end": {"line": 81, "column": null}}, "type": "if", "locations": [{"start": {"line": 77, "column": 12}, "end": {"line": 81, "column": null}}, {"start": {"line": 79, "column": 19}, "end": {"line": 81, "column": null}}]}, "10": {"loc": {"start": {"line": 85, "column": 8}, "end": {"line": 87, "column": null}}, "type": "if", "locations": [{"start": {"line": 85, "column": 8}, "end": {"line": 87, "column": null}}, {"start": {}, "end": {}}]}, "11": {"loc": {"start": {"line": 88, "column": 8}, "end": {"line": 90, "column": null}}, "type": "if", "locations": [{"start": {"line": 88, "column": 8}, "end": {"line": 90, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 93, "column": 4}, "end": {"line": 95, "column": null}}, "type": "if", "locations": [{"start": {"line": 93, "column": 4}, "end": {"line": 95, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 100, "column": 4}, "end": {"line": 102, "column": null}}, "type": "if", "locations": [{"start": {"line": 100, "column": 4}, "end": {"line": 102, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 114, "column": 4}, "end": {"line": 116, "column": null}}, "type": "if", "locations": [{"start": {"line": 114, "column": 4}, "end": {"line": 116, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 126, "column": 4}, "end": {"line": 128, "column": null}}, "type": "if", "locations": [{"start": {"line": 126, "column": 4}, "end": {"line": 128, "column": null}}, {"start": {}, "end": {}}]}, "16": {"loc": {"start": {"line": 139, "column": 43}, "end": {"line": 139, "column": 97}}, "type": "cond-expr", "locations": [{"start": {"line": 139, "column": 68}, "end": {"line": 139, "column": 84}}, {"start": {"line": 139, "column": 84}, "end": {"line": 139, "column": 97}}]}, "17": {"loc": {"start": {"line": 157, "column": 15}, "end": {"line": 157, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 157, "column": 51}, "end": {"line": 157, "column": 67}}, {"start": {"line": 157, "column": 67}, "end": {"line": 157, "column": null}}]}, "18": {"loc": {"start": {"line": 158, "column": 4}, "end": {"line": 160, "column": null}}, "type": "if", "locations": [{"start": {"line": 158, "column": 4}, "end": {"line": 160, "column": null}}, {"start": {}, "end": {}}]}, "19": {"loc": {"start": {"line": 162, "column": 4}, "end": {"line": 164, "column": null}}, "type": "if", "locations": [{"start": {"line": 162, "column": 4}, "end": {"line": 164, "column": null}}, {"start": {}, "end": {}}]}, "20": {"loc": {"start": {"line": 162, "column": 8}, "end": {"line": 162, "column": 87}}, "type": "binary-expr", "locations": [{"start": {"line": 162, "column": 8}, "end": {"line": 162, "column": 33}}, {"start": {"line": 162, "column": 33}, "end": {"line": 162, "column": 56}}, {"start": {"line": 162, "column": 56}, "end": {"line": 162, "column": 87}}]}, "21": {"loc": {"start": {"line": 165, "column": 4}, "end": {"line": 167, "column": null}}, "type": "if", "locations": [{"start": {"line": 165, "column": 4}, "end": {"line": 167, "column": null}}, {"start": {}, "end": {}}]}, "22": {"loc": {"start": {"line": 165, "column": 8}, "end": {"line": 165, "column": 89}}, "type": "binary-expr", "locations": [{"start": {"line": 165, "column": 8}, "end": {"line": 165, "column": 34}}, {"start": {"line": 165, "column": 34}, "end": {"line": 165, "column": 57}}, {"start": {"line": 165, "column": 57}, "end": {"line": 165, "column": 89}}]}, "23": {"loc": {"start": {"line": 191, "column": 4}, "end": {"line": 194, "column": null}}, "type": "if", "locations": [{"start": {"line": 191, "column": 4}, "end": {"line": 194, "column": null}}, {"start": {}, "end": {}}]}, "24": {"loc": {"start": {"line": 193, "column": 21}, "end": {"line": 193, "column": 51}}, "type": "cond-expr", "locations": [{"start": {"line": 193, "column": 46}, "end": {"line": 193, "column": 50}}, {"start": {"line": 193, "column": 50}, "end": {"line": 193, "column": 51}}]}, "25": {"loc": {"start": {"line": 201, "column": 4}, "end": {"line": 207, "column": null}}, "type": "if", "locations": [{"start": {"line": 201, "column": 4}, "end": {"line": 207, "column": null}}, {"start": {}, "end": {}}]}, "26": {"loc": {"start": {"line": 224, "column": 4}, "end": {"line": 226, "column": null}}, "type": "if", "locations": [{"start": {"line": 224, "column": 4}, "end": {"line": 226, "column": null}}, {"start": {}, "end": {}}]}, "27": {"loc": {"start": {"line": 240, "column": 4}, "end": {"line": 246, "column": null}}, "type": "if", "locations": [{"start": {"line": 240, "column": 4}, "end": {"line": 246, "column": null}}, {"start": {}, "end": {}}]}, "28": {"loc": {"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, "type": "if", "locations": [{"start": {"line": 250, "column": 4}, "end": {"line": 252, "column": null}}, {"start": {}, "end": {}}]}, "29": {"loc": {"start": {"line": 278, "column": 0}, "end": {"line": 283, "column": null}}, "type": "if", "locations": [{"start": {"line": 278, "column": 0}, "end": {"line": 283, "column": null}}, {"start": {}, "end": {}}]}, "30": {"loc": {"start": {"line": 279, "column": 4}, "end": {"line": 280, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 279, "column": 4}, "end": {"line": 279, "column": null}}, {"start": {"line": 280, "column": 4}, "end": {"line": 280, "column": null}}]}}, "s": {"0": 1, "1": 8, "2": 2, "3": 6, "4": 6, "5": 3, "6": 3, "7": 11, "8": 11, "9": 11, "10": 11, "11": 11, "12": 11, "13": 19, "14": 19, "15": 2, "16": 17, "17": 2, "18": 2, "19": 1, "20": 1, "21": 1, "22": 1, "23": 15, "24": 5, "25": 5, "26": 3, "27": 2, "28": 1, "29": 1, "30": 2, "31": 2, "32": 10, "33": 1, "34": 9, "35": 1, "36": 8, "37": 3, "38": 1, "39": 2, "40": 0, "41": 0, "42": 0, "43": 0, "44": 0, "45": 0, "46": 20, "47": 6, "48": 14, "49": 8, "50": 6, "51": 2, "52": 0, "53": 0, "54": 0, "55": 0, "56": 0, "57": 0, "58": 0, "59": 7, "60": 7, "61": 1, "62": 6, "63": 6, "64": 1, "65": 5, "66": 2, "67": 3, "68": 0, "69": 0, "70": 0, "71": 0, "72": 0, "73": 0, "74": 0, "75": 0, "76": 0, "77": 0, "78": 0, "79": 0, "80": 0, "81": 0, "82": 0, "83": 0, "84": 0, "85": 0, "86": 4, "87": 4, "88": 4, "89": 4, "90": 4, "91": 4, "92": 1, "93": 4, "94": 4, "95": 4, "96": 4, "97": 4, "98": 4, "99": 4, "100": 4, "101": 0, "102": 4, "103": 1, "104": 1, "105": 1, "106": 1, "107": 4, "108": 4, "109": 4, "110": 3, "111": 4, "112": 1, "113": 4, "114": 4, "115": 4, "116": 4, "117": 4, "118": 4, "119": 4, "120": 4, "121": 0, "122": 4, "123": 4, "124": 4, "125": 1, "126": 0}, "f": {"0": 8, "1": 11, "2": 0, "3": 20, "4": 8, "5": 0, "6": 0, "7": 0, "8": 7, "9": 0, "10": 0, "11": 0, "12": 0, "13": 0, "14": 0, "15": 0, "16": 4, "17": 0}, "b": {"0": [2, 6], "1": [3, 3], "2": [2, 17], "3": [19, 18], "4": [2, 15], "5": [1, 1], "6": [5, 10], "7": [15, 12], "8": [3, 2], "9": [1, 1], "10": [1, 9], "11": [1, 8], "12": [1, 2], "13": [0, 0], "14": [6, 14], "15": [6, 2], "16": [0, 0], "17": [6, 1], "18": [1, 6], "19": [1, 5], "20": [6, 5, 4], "21": [2, 3], "22": [5, 3, 3], "23": [0, 0], "24": [0, 0], "25": [0, 0], "26": [1, 3], "27": [1, 3], "28": [3, 1], "29": [0, 1], "30": [1, 1]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/tools/corpus-replay.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/tools/corpus-replay.ts", "statementMap": {"0": {"start": {"line": 46, "column": 4}, "end": {"line": 46, "column": null}}, "1": {"start": {"line": 53, "column": 4}, "end": {"line": 53, "column": null}}, "2": {"start": {"line": 60, "column": 38}, "end": {"line": 352, "column": null}}, "3": {"start": {"line": 360, "column": 30}, "end": {"line": 360, "column": null}}, "4": {"start": {"line": 377, "column": 4}, "end": {"line": 392, "column": null}}, "5": {"start": {"line": 379, "column": 8}, "end": {"line": 379, "column": null}}, "6": {"start": {"line": 382, "column": 8}, "end": {"line": 382, "column": null}}, "7": {"start": {"line": 385, "column": 8}, "end": {"line": 385, "column": null}}, "8": {"start": {"line": 388, "column": 8}, "end": {"line": 390, "column": null}}, "9": {"start": {"line": 389, "column": 40}, "end": {"line": 389, "column": 48}}, "10": {"start": {"line": 389, "column": 64}, "end": {"line": 389, "column": 76}}, "11": {"start": {"line": 399, "column": 14}, "end": {"line": 399, "column": null}}, "12": {"start": {"line": 400, "column": 4}, "end": {"line": 407, "column": null}}, "13": {"start": {"line": 406, "column": 8}, "end": {"line": 406, "column": null}}, "14": {"start": {"line": 408, "column": 4}, "end": {"line": 408, "column": null}}, "15": {"start": {"line": 409, "column": 4}, "end": {"line": 409, "column": null}}, "16": {"start": {"line": 414, "column": 4}, "end": {"line": 416, "column": null}}, "17": {"start": {"line": 415, "column": 8}, "end": {"line": 415, "column": null}}, "18": {"start": {"line": 419, "column": 4}, "end": {"line": 421, "column": null}}, "19": {"start": {"line": 420, "column": 8}, "end": {"line": 420, "column": null}}, "20": {"start": {"line": 422, "column": 4}, "end": {"line": 422, "column": null}}, "21": {"start": {"line": 428, "column": 17}, "end": {"line": 428, "column": null}}, "22": {"start": {"line": 429, "column": 28}, "end": {"line": 436, "column": null}}, "23": {"start": {"line": 437, "column": 4}, "end": {"line": 462, "column": null}}, "24": {"start": {"line": 437, "column": 17}, "end": {"line": 437, "column": 20}}, "25": {"start": {"line": 438, "column": 20}, "end": {"line": 438, "column": null}}, "26": {"start": {"line": 439, "column": 22}, "end": {"line": 439, "column": null}}, "27": {"start": {"line": 440, "column": 8}, "end": {"line": 448, "column": null}}, "28": {"start": {"line": 441, "column": 26}, "end": {"line": 441, "column": null}}, "29": {"start": {"line": 442, "column": 12}, "end": {"line": 444, "column": null}}, "30": {"start": {"line": 443, "column": 16}, "end": {"line": 443, "column": null}}, "31": {"start": {"line": 445, "column": 12}, "end": {"line": 445, "column": null}}, "32": {"start": {"line": 446, "column": 12}, "end": {"line": 446, "column": null}}, "33": {"start": {"line": 447, "column": 12}, "end": {"line": 447, "column": null}}, "34": {"start": {"line": 449, "column": 8}, "end": {"line": 456, "column": null}}, "35": {"start": {"line": 450, "column": 26}, "end": {"line": 450, "column": null}}, "36": {"start": {"line": 451, "column": 12}, "end": {"line": 453, "column": null}}, "37": {"start": {"line": 452, "column": 16}, "end": {"line": 452, "column": null}}, "38": {"start": {"line": 454, "column": 12}, "end": {"line": 454, "column": null}}, "39": {"start": {"line": 455, "column": 12}, "end": {"line": 455, "column": null}}, "40": {"start": {"line": 457, "column": 8}, "end": {"line": 460, "column": null}}, "41": {"start": {"line": 458, "column": 12}, "end": {"line": 458, "column": null}}, "42": {"start": {"line": 459, "column": 12}, "end": {"line": 459, "column": null}}, "43": {"start": {"line": 461, "column": 8}, "end": {"line": 461, "column": null}}, "44": {"start": {"line": 463, "column": 18}, "end": {"line": 463, "column": null}}, "45": {"start": {"line": 464, "column": 4}, "end": {"line": 466, "column": null}}, "46": {"start": {"line": 465, "column": 8}, "end": {"line": 465, "column": null}}, "47": {"start": {"line": 467, "column": 4}, "end": {"line": 467, "column": null}}, "48": {"start": {"line": 479, "column": 21}, "end": {"line": 479, "column": null}}, "49": {"start": {"line": 480, "column": 4}, "end": {"line": 480, "column": null}}, "50": {"start": {"line": 481, "column": 18}, "end": {"line": 481, "column": null}}, "51": {"start": {"line": 482, "column": 4}, "end": {"line": 487, "column": null}}, "52": {"start": {"line": 483, "column": 8}, "end": {"line": 485, "column": null}}, "53": {"start": {"line": 486, "column": 8}, "end": {"line": 486, "column": null}}, "54": {"start": {"line": 488, "column": 4}, "end": {"line": 493, "column": null}}, "55": {"start": {"line": 489, "column": 8}, "end": {"line": 491, "column": null}}, "56": {"start": {"line": 492, "column": 8}, "end": {"line": 492, "column": null}}, "57": {"start": {"line": 494, "column": 40}, "end": {"line": 494, "column": null}}, "58": {"start": {"line": 495, "column": 44}, "end": {"line": 495, "column": null}}, "59": {"start": {"line": 496, "column": 4}, "end": {"line": 501, "column": null}}, "60": {"start": {"line": 497, "column": 8}, "end": {"line": 499, "column": null}}, "61": {"start": {"line": 500, "column": 8}, "end": {"line": 500, "column": null}}, "62": {"start": {"line": 502, "column": 4}, "end": {"line": 502, "column": null}}, "63": {"start": {"line": 509, "column": 4}, "end": {"line": 511, "column": null}}, "64": {"start": {"line": 510, "column": 8}, "end": {"line": 510, "column": null}}, "65": {"start": {"line": 512, "column": 21}, "end": {"line": 512, "column": null}}, "66": {"start": {"line": 512, "column": 42}, "end": {"line": 512, "column": 57}}, "67": {"start": {"line": 513, "column": 20}, "end": {"line": 513, "column": null}}, "68": {"start": {"line": 513, "column": 46}, "end": {"line": 513, "column": 78}}, "69": {"start": {"line": 513, "column": 66}, "end": {"line": 513, "column": 77}}, "70": {"start": {"line": 514, "column": 4}, "end": {"line": 516, "column": null}}, "71": {"start": {"line": 515, "column": 8}, "end": {"line": 515, "column": null}}, "72": {"start": {"line": 517, "column": 4}, "end": {"line": 517, "column": null}}, "73": {"start": {"line": 527, "column": 30}, "end": {"line": 527, "column": null}}, "74": {"start": {"line": 528, "column": 18}, "end": {"line": 528, "column": null}}, "75": {"start": {"line": 529, "column": 4}, "end": {"line": 565, "column": null}}, "76": {"start": {"line": 530, "column": 24}, "end": {"line": 536, "column": null}}, "77": {"start": {"line": 538, "column": 8}, "end": {"line": 560, "column": null}}, "78": {"start": {"line": 539, "column": 26}, "end": {"line": 539, "column": null}}, "79": {"start": {"line": 540, "column": 12}, "end": {"line": 540, "column": null}}, "80": {"start": {"line": 540, "column": 23}, "end": {"line": 540, "column": null}}, "81": {"start": {"line": 541, "column": 12}, "end": {"line": 548, "column": null}}, "82": {"start": {"line": 550, "column": 12}, "end": {"line": 559, "column": null}}, "83": {"start": {"line": 561, "column": 8}, "end": {"line": 561, "column": null}}, "84": {"start": {"line": 562, "column": 8}, "end": {"line": 564, "column": null}}, "85": {"start": {"line": 566, "column": 4}, "end": {"line": 566, "column": null}}, "86": {"start": {"line": 570, "column": 19}, "end": {"line": 570, "column": null}}, "87": {"start": {"line": 571, "column": 4}, "end": {"line": 574, "column": null}}, "88": {"start": {"line": 572, "column": 8}, "end": {"line": 572, "column": null}}, "89": {"start": {"line": 573, "column": 8}, "end": {"line": 573, "column": null}}, "90": {"start": {"line": 576, "column": 21}, "end": {"line": 576, "column": null}}, "91": {"start": {"line": 577, "column": 4}, "end": {"line": 579, "column": null}}, "92": {"start": {"line": 578, "column": 8}, "end": {"line": 578, "column": null}}, "93": {"start": {"line": 581, "column": 22}, "end": {"line": 581, "column": null}}, "94": {"start": {"line": 582, "column": 4}, "end": {"line": 585, "column": null}}, "95": {"start": {"line": 583, "column": 8}, "end": {"line": 583, "column": null}}, "96": {"start": {"line": 584, "column": 8}, "end": {"line": 584, "column": null}}, "97": {"start": {"line": 587, "column": 21}, "end": {"line": 587, "column": null}}, "98": {"start": {"line": 588, "column": 23}, "end": {"line": 588, "column": null}}, "99": {"start": {"line": 589, "column": 30}, "end": {"line": 594, "column": null}}, "100": {"start": {"line": 595, "column": 21}, "end": {"line": 595, "column": null}}, "101": {"start": {"line": 597, "column": 26}, "end": {"line": 597, "column": null}}, "102": {"start": {"line": 598, "column": 19}, "end": {"line": 612, "column": null}}, "103": {"start": {"line": 613, "column": 17}, "end": {"line": 613, "column": null}}, "104": {"start": {"line": 614, "column": 4}, "end": {"line": 616, "column": null}}, "105": {"start": {"line": 615, "column": 8}, "end": {"line": 615, "column": null}}, "106": {"start": {"line": 617, "column": 4}, "end": {"line": 617, "column": null}}, "107": {"start": {"line": 618, "column": 4}, "end": {"line": 620, "column": null}}, "108": {"start": {"line": 619, "column": 8}, "end": {"line": 619, "column": null}}, "109": {"start": {"line": 621, "column": 4}, "end": {"line": 626, "column": null}}, "110": {"start": {"line": 622, "column": 8}, "end": {"line": 624, "column": null}}, "111": {"start": {"line": 623, "column": 12}, "end": {"line": 623, "column": null}}, "112": {"start": {"line": 625, "column": 8}, "end": {"line": 625, "column": null}}, "113": {"start": {"line": 627, "column": 4}, "end": {"line": 627, "column": null}}, "114": {"start": {"line": 630, "column": 0}, "end": {"line": 635, "column": null}}, "115": {"start": {"line": 634, "column": 4}, "end": {"line": 634, "column": null}}}, "fnMap": {"0": {"name": "user", "decl": {"start": {"line": 45, "column": 9}, "end": {"line": 45, "column": 14}}, "loc": {"start": {"line": 45, "column": 46}, "end": {"line": 47, "column": null}}}, "1": {"name": "verbatimRequest", "decl": {"start": {"line": 52, "column": 9}, "end": {"line": 52, "column": 25}}, "loc": {"start": {"line": 52, "column": 42}, "end": {"line": 54, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 378, "column": 18}, "end": {"line": 378, "column": 19}}, "loc": {"start": {"line": 378, "column": 36}, "end": {"line": 380, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 381, "column": 15}, "end": {"line": 381, "column": 16}}, "loc": {"start": {"line": 381, "column": 33}, "end": {"line": 383, "column": null}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 384, "column": 13}, "end": {"line": 384, "column": 14}}, "loc": {"start": {"line": 384, "column": 31}, "end": {"line": 386, "column": null}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 387, "column": 14}, "end": {"line": 387, "column": 15}}, "loc": {"start": {"line": 387, "column": 32}, "end": {"line": 391, "column": null}}}, "6": {"name": "(anonymous_6)", "decl": {"start": {"line": 389, "column": 33}, "end": {"line": 389, "column": 34}}, "loc": {"start": {"line": 389, "column": 40}, "end": {"line": 389, "column": 48}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 389, "column": 57}, "end": {"line": 389, "column": 58}}, "loc": {"start": {"line": 389, "column": 64}, "end": {"line": 389, "column": 76}}}, "8": {"name": "applyTimeoutOption", "decl": {"start": {"line": 395, "column": 16}, "end": {"line": 395, "column": null}}, "loc": {"start": {"line": 398, "column": 17}, "end": {"line": 410, "column": null}}}, "9": {"name": "validateCliState", "decl": {"start": {"line": 413, "column": 16}, "end": {"line": 413, "column": 33}}, "loc": {"start": {"line": 413, "column": 65}, "end": {"line": 423, "column": null}}}, "10": {"name": "parseArgs", "decl": {"start": {"line": 427, "column": 16}, "end": {"line": 427, "column": 26}}, "loc": {"start": {"line": 427, "column": 83}, "end": {"line": 468, "column": null}}}, "11": {"name": "resolveReplayModel", "decl": {"start": {"line": 475, "column": 15}, "end": {"line": 475, "column": null}}, "loc": {"start": {"line": 478, "column": 39}, "end": {"line": 503, "column": null}}}, "12": {"name": "selectCorpusCases", "decl": {"start": {"line": 506, "column": 16}, "end": {"line": 506, "column": null}}, "loc": {"start": {"line": 508, "column": 59}, "end": {"line": 518, "column": null}}}, "13": {"name": "(anonymous_13)", "decl": {"start": {"line": 512, "column": 35}, "end": {"line": 512, "column": 36}}, "loc": {"start": {"line": 512, "column": 42}, "end": {"line": 512, "column": 57}}}, "14": {"name": "(anonymous_14)", "decl": {"start": {"line": 513, "column": 38}, "end": {"line": 513, "column": 39}}, "loc": {"start": {"line": 513, "column": 46}, "end": {"line": 513, "column": 78}}}, "15": {"name": "(anonymous_15)", "decl": {"start": {"line": 513, "column": 59}, "end": {"line": 513, "column": 60}}, "loc": {"start": {"line": 513, "column": 66}, "end": {"line": 513, "column": 77}}}, "16": {"name": "replayCorpus", "decl": {"start": {"line": 521, "column": 22}, "end": {"line": 521, "column": null}}, "loc": {"start": {"line": 526, "column": 51}, "end": {"line": 567, "column": null}}}, "17": {"name": "main", "decl": {"start": {"line": 569, "column": 15}, "end": {"line": 569, "column": 39}}, "loc": {"start": {"line": 569, "column": 39}, "end": {"line": 628, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 400, "column": 4}, "end": {"line": 407, "column": null}}, "type": "if", "locations": [{"start": {"line": 400, "column": 4}, "end": {"line": 407, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 401, "column": 8}, "end": {"line": 404, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 401, "column": 8}, "end": {"line": 401, "column": null}}, {"start": {"line": 402, "column": 8}, "end": {"line": 402, "column": null}}, {"start": {"line": 403, "column": 8}, "end": {"line": 403, "column": null}}, {"start": {"line": 404, "column": 8}, "end": {"line": 404, "column": null}}]}, "2": {"loc": {"start": {"line": 414, "column": 4}, "end": {"line": 416, "column": null}}, "type": "if", "locations": [{"start": {"line": 414, "column": 4}, "end": {"line": 416, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 414, "column": 8}, "end": {"line": 414, "column": 53}}, "type": "binary-expr", "locations": [{"start": {"line": 414, "column": 8}, "end": {"line": 414, "column": 33}}, {"start": {"line": 414, "column": 33}, "end": {"line": 414, "column": 53}}]}, "4": {"loc": {"start": {"line": 419, "column": 4}, "end": {"line": 421, "column": null}}, "type": "if", "locations": [{"start": {"line": 419, "column": 4}, "end": {"line": 421, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 419, "column": 8}, "end": {"line": 419, "column": 46}}, "type": "binary-expr", "locations": [{"start": {"line": 419, "column": 8}, "end": {"line": 419, "column": 24}}, {"start": {"line": 419, "column": 24}, "end": {"line": 419, "column": 46}}]}, "6": {"loc": {"start": {"line": 440, "column": 8}, "end": {"line": 448, "column": null}}, "type": "if", "locations": [{"start": {"line": 440, "column": 8}, "end": {"line": 448, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 442, "column": 12}, "end": {"line": 444, "column": null}}, "type": "if", "locations": [{"start": {"line": 442, "column": 12}, "end": {"line": 444, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 449, "column": 8}, "end": {"line": 456, "column": null}}, "type": "if", "locations": [{"start": {"line": 449, "column": 8}, "end": {"line": 456, "column": null}}, {"start": {}, "end": {}}]}, "9": {"loc": {"start": {"line": 451, "column": 12}, "end": {"line": 453, "column": null}}, "type": "if", "locations": [{"start": {"line": 451, "column": 12}, "end": {"line": 453, "column": null}}, {"start": {}, "end": {}}]}, "10": {"loc": {"start": {"line": 457, "column": 8}, "end": {"line": 460, "column": null}}, "type": "if", "locations": [{"start": {"line": 457, "column": 8}, "end": {"line": 460, "column": null}}, {"start": {}, "end": {}}]}, "11": {"loc": {"start": {"line": 464, "column": 4}, "end": {"line": 466, "column": null}}, "type": "if", "locations": [{"start": {"line": 464, "column": 4}, "end": {"line": 466, "column": null}}, {"start": {}, "end": {}}]}, "12": {"loc": {"start": {"line": 482, "column": 4}, "end": {"line": 487, "column": null}}, "type": "if", "locations": [{"start": {"line": 482, "column": 4}, "end": {"line": 487, "column": null}}, {"start": {}, "end": {}}]}, "13": {"loc": {"start": {"line": 488, "column": 4}, "end": {"line": 493, "column": null}}, "type": "if", "locations": [{"start": {"line": 488, "column": 4}, "end": {"line": 493, "column": null}}, {"start": {}, "end": {}}]}, "14": {"loc": {"start": {"line": 496, "column": 4}, "end": {"line": 501, "column": null}}, "type": "if", "locations": [{"start": {"line": 496, "column": 4}, "end": {"line": 501, "column": null}}, {"start": {}, "end": {}}]}, "15": {"loc": {"start": {"line": 498, "column": 78}, "end": {"line": 498, "column": 148}}, "type": "cond-expr", "locations": [{"start": {"line": 498, "column": 120}, "end": {"line": 498, "column": 144}}, {"start": {"line": 498, "column": 144}, "end": {"line": 498, "column": 148}}]}, "16": {"loc": {"start": {"line": 509, "column": 4}, "end": {"line": 511, "column": null}}, "type": "if", "locations": [{"start": {"line": 509, "column": 4}, "end": {"line": 511, "column": null}}, {"start": {}, "end": {}}]}, "17": {"loc": {"start": {"line": 514, "column": 4}, "end": {"line": 516, "column": null}}, "type": "if", "locations": [{"start": {"line": 514, "column": 4}, "end": {"line": 516, "column": null}}, {"start": {}, "end": {}}]}, "18": {"loc": {"start": {"line": 538, "column": 8}, "end": {"line": 560, "column": null}}, "type": "if", "locations": [{"start": {"line": 538, "column": 8}, "end": {"line": 560, "column": null}}, {"start": {"line": 549, "column": 15}, "end": {"line": 560, "column": null}}]}, "19": {"loc": {"start": {"line": 540, "column": 12}, "end": {"line": 540, "column": null}}, "type": "if", "locations": [{"start": {"line": 540, "column": 12}, "end": {"line": 540, "column": null}}, {"start": {}, "end": {}}]}, "20": {"loc": {"start": {"line": 563, "column": 24}, "end": {"line": 563, "column": 61}}, "type": "binary-expr", "locations": [{"start": {"line": 563, "column": 24}, "end": {"line": 563, "column": 39}}, {"start": {"line": 563, "column": 39}, "end": {"line": 563, "column": 61}}]}, "21": {"loc": {"start": {"line": 563, "column": 90}, "end": {"line": 563, "column": 118}}, "type": "cond-expr", "locations": [{"start": {"line": 563, "column": 102}, "end": {"line": 563, "column": 112}}, {"start": {"line": 563, "column": 112}, "end": {"line": 563, "column": 118}}]}, "22": {"loc": {"start": {"line": 571, "column": 4}, "end": {"line": 574, "column": null}}, "type": "if", "locations": [{"start": {"line": 571, "column": 4}, "end": {"line": 574, "column": null}}, {"start": {}, "end": {}}]}, "23": {"loc": {"start": {"line": 577, "column": 4}, "end": {"line": 579, "column": null}}, "type": "if", "locations": [{"start": {"line": 577, "column": 4}, "end": {"line": 579, "column": null}}, {"start": {}, "end": {}}]}, "24": {"loc": {"start": {"line": 582, "column": 4}, "end": {"line": 585, "column": null}}, "type": "if", "locations": [{"start": {"line": 582, "column": 4}, "end": {"line": 585, "column": null}}, {"start": {}, "end": {}}]}, "25": {"loc": {"start": {"line": 614, "column": 4}, "end": {"line": 616, "column": null}}, "type": "if", "locations": [{"start": {"line": 614, "column": 4}, "end": {"line": 616, "column": null}}, {"start": {}, "end": {}}]}, "26": {"loc": {"start": {"line": 618, "column": 4}, "end": {"line": 620, "column": null}}, "type": "if", "locations": [{"start": {"line": 618, "column": 4}, "end": {"line": 620, "column": null}}, {"start": {}, "end": {}}]}, "27": {"loc": {"start": {"line": 621, "column": 4}, "end": {"line": 626, "column": null}}, "type": "if", "locations": [{"start": {"line": 621, "column": 4}, "end": {"line": 626, "column": null}}, {"start": {}, "end": {}}]}, "28": {"loc": {"start": {"line": 630, "column": 0}, "end": {"line": 635, "column": null}}, "type": "if", "locations": [{"start": {"line": 630, "column": 0}, "end": {"line": 635, "column": null}}, {"start": {}, "end": {}}]}, "29": {"loc": {"start": {"line": 631, "column": 4}, "end": {"line": 632, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 631, "column": 4}, "end": {"line": 631, "column": null}}, {"start": {"line": 632, "column": 4}, "end": {"line": 632, "column": null}}]}}, "s": {"0": 40, "1": 12, "2": 2, "3": 2, "4": 2, "5": 5, "6": 5, "7": 0, "8": 2, "9": 4, "10": 4, "11": 8, "12": 8, "13": 5, "14": 3, "15": 3, "16": 8, "17": 3, "18": 5, "19": 2, "20": 3, "21": 6, "22": 6, "23": 6, "24": 6, "25": 16, "26": 16, "27": 16, "28": 13, "29": 13, "30": 1, "31": 12, "32": 12, "33": 12, "34": 3, "35": 0, "36": 0, "37": 0, "38": 0, "39": 0, "40": 3, "41": 2, "42": 2, "43": 1, "44": 4, "45": 4, "46": 2, "47": 2, "48": 0, "49": 0, "50": 0, "51": 0, "52": 0, "53": 0, "54": 0, "55": 0, "56": 0, "57": 0, "58": 0, "59": 0, "60": 0, "61": 0, "62": 0, "63": 5, "64": 1, "65": 4, "66": 84, "67": 4, "68": 7, "69": 33, "70": 4, "71": 1, "72": 3, "73": 2, "74": 2, "75": 2, "76": 3, "77": 3, "78": 2, "79": 2, "80": 1, "81": 2, "82": 1, "83": 3, "84": 3, "85": 2, "86": 0, "87": 0, "88": 0, "89": 0, "90": 0, "91": 0, "92": 0, "93": 0, "94": 0, "95": 0, "96": 0, "97": 0, "98": 0, "99": 0, "100": 0, "101": 0, "102": 0, "103": 0, "104": 0, "105": 0, "106": 0, "107": 0, "108": 0, "109": 0, "110": 0, "111": 0, "112": 0, "113": 0, "114": 2, "115": 0}, "f": {"0": 40, "1": 12, "2": 5, "3": 5, "4": 0, "5": 2, "6": 4, "7": 4, "8": 8, "9": 8, "10": 6, "11": 0, "12": 5, "13": 84, "14": 7, "15": 33, "16": 2, "17": 0}, "b": {"0": [5, 3], "1": [8, 7, 5, 4], "2": [3, 5], "3": [8, 6], "4": [2, 3], "5": [5, 3], "6": [13, 3], "7": [1, 12], "8": [0, 3], "9": [0, 0], "10": [2, 1], "11": [2, 2], "12": [0, 0], "13": [0, 0], "14": [0, 0], "15": [0, 0], "16": [1, 4], "17": [1, 3], "18": [2, 1], "19": [1, 1], "20": [3, 1], "21": [1, 2], "22": [0, 0], "23": [0, 0], "24": [0, 0], "25": [0, 0], "26": [0, 0], "27": [0, 0], "28": [0, 2], "29": [2, 2]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/tools/replay-qualify.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-ai-judge/tools/replay-qualify.ts", "statementMap": {"0": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "1": {"start": {"line": 54, "column": 8}, "end": {"line": 54, "column": null}}, "2": {"start": {"line": 56, "column": 18}, "end": {"line": 56, "column": null}}, "3": {"start": {"line": 57, "column": 4}, "end": {"line": 57, "column": null}}, "4": {"start": {"line": 61, "column": 4}, "end": {"line": 61, "column": null}}, "5": {"start": {"line": 69, "column": 30}, "end": {"line": 69, "column": null}}, "6": {"start": {"line": 70, "column": 4}, "end": {"line": 72, "column": null}}, "7": {"start": {"line": 71, "column": 8}, "end": {"line": 71, "column": null}}, "8": {"start": {"line": 74, "column": 22}, "end": {"line": 74, "column": null}}, "9": {"start": {"line": 74, "column": 43}, "end": {"line": 74, "column": 63}}, "10": {"start": {"line": 75, "column": 23}, "end": {"line": 77, "column": null}}, "11": {"start": {"line": 76, "column": 25}, "end": {"line": 76, "column": 53}}, "12": {"start": {"line": 77, "column": 22}, "end": {"line": 77, "column": 30}}, "13": {"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, "14": {"start": {"line": 79, "column": 8}, "end": {"line": 79, "column": null}}, "15": {"start": {"line": 82, "column": 35}, "end": {"line": 84, "column": null}}, "16": {"start": {"line": 83, "column": 25}, "end": {"line": 83, "column": 45}}, "17": {"start": {"line": 84, "column": 22}, "end": {"line": 84, "column": 30}}, "18": {"start": {"line": 85, "column": 4}, "end": {"line": 89, "column": null}}, "19": {"start": {"line": 86, "column": 8}, "end": {"line": 88, "column": null}}, "20": {"start": {"line": 93, "column": 27}, "end": {"line": 93, "column": null}}, "21": {"start": {"line": 93, "column": 53}, "end": {"line": 93, "column": 82}}, "22": {"start": {"line": 94, "column": 4}, "end": {"line": 100, "column": null}}, "23": {"start": {"line": 95, "column": 8}, "end": {"line": 99, "column": null}}, "24": {"start": {"line": 97, "column": 30}, "end": {"line": 97, "column": 38}}, "25": {"start": {"line": 102, "column": 22}, "end": {"line": 105, "column": null}}, "26": {"start": {"line": 103, "column": 22}, "end": {"line": 103, "column": 35}}, "27": {"start": {"line": 105, "column": 24}, "end": {"line": 105, "column": 29}}, "28": {"start": {"line": 106, "column": 23}, "end": {"line": 108, "column": null}}, "29": {"start": {"line": 107, "column": 17}, "end": {"line": 107, "column": null}}, "30": {"start": {"line": 109, "column": 4}, "end": {"line": 115, "column": null}}, "31": {"start": {"line": 110, "column": 8}, "end": {"line": 114, "column": null}}, "32": {"start": {"line": 112, "column": 30}, "end": {"line": 112, "column": 64}}, "33": {"start": {"line": 117, "column": 20}, "end": {"line": 117, "column": null}}, "34": {"start": {"line": 117, "column": 46}, "end": {"line": 117, "column": 74}}, "35": {"start": {"line": 118, "column": 4}, "end": {"line": 130, "column": null}}}, "fnMap": {"0": {"name": "percentile", "decl": {"start": {"line": 52, "column": 9}, "end": {"line": 52, "column": 20}}, "loc": {"start": {"line": 52, "column": 76}, "end": {"line": 58, "column": null}}}, "1": {"name": "usableLatency", "decl": {"start": {"line": 60, "column": 9}, "end": {"line": 60, "column": 23}}, "loc": {"start": {"line": 60, "column": 56}, "end": {"line": 62, "column": null}}}, "2": {"name": "qualifyReplay", "decl": {"start": {"line": 65, "column": 16}, "end": {"line": 65, "column": null}}, "loc": {"start": {"line": 68, "column": 23}, "end": {"line": 131, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 74, "column": 34}, "end": {"line": 74, "column": 35}}, "loc": {"start": {"line": 74, "column": 43}, "end": {"line": 74, "column": 63}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 76, "column": 16}, "end": {"line": 76, "column": 17}}, "loc": {"start": {"line": 76, "column": 25}, "end": {"line": 76, "column": 53}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 77, "column": 13}, "end": {"line": 77, "column": 14}}, "loc": {"start": {"line": 77, "column": 22}, "end": {"line": 77, "column": 30}}}, "6": {"name": "(anonymous_6)", "decl": {"start": {"line": 83, "column": 16}, "end": {"line": 83, "column": 17}}, "loc": {"start": {"line": 83, "column": 25}, "end": {"line": 83, "column": 45}}}, "7": {"name": "(anonymous_7)", "decl": {"start": {"line": 84, "column": 13}, "end": {"line": 84, "column": 14}}, "loc": {"start": {"line": 84, "column": 22}, "end": {"line": 84, "column": 30}}}, "8": {"name": "(anonymous_8)", "decl": {"start": {"line": 93, "column": 44}, "end": {"line": 93, "column": 45}}, "loc": {"start": {"line": 93, "column": 53}, "end": {"line": 93, "column": 82}}}, "9": {"name": "(anonymous_9)", "decl": {"start": {"line": 97, "column": 21}, "end": {"line": 97, "column": 22}}, "loc": {"start": {"line": 97, "column": 30}, "end": {"line": 97, "column": 38}}}, "10": {"name": "(anonymous_10)", "decl": {"start": {"line": 103, "column": 13}, "end": {"line": 103, "column": 14}}, "loc": {"start": {"line": 103, "column": 22}, "end": {"line": 103, "column": 35}}}, "11": {"name": "(anonymous_11)", "decl": {"start": {"line": 105, "column": 14}, "end": {"line": 105, "column": 15}}, "loc": {"start": {"line": 105, "column": 24}, "end": {"line": 105, "column": 29}}}, "12": {"name": "(anonymous_12)", "decl": {"start": {"line": 107, "column": 8}, "end": {"line": 107, "column": 9}}, "loc": {"start": {"line": 107, "column": 17}, "end": {"line": 107, "column": null}}}, "13": {"name": "(anonymous_13)", "decl": {"start": {"line": 112, "column": 21}, "end": {"line": 112, "column": 22}}, "loc": {"start": {"line": 112, "column": 30}, "end": {"line": 112, "column": 64}}}, "14": {"name": "(anonymous_14)", "decl": {"start": {"line": 117, "column": 37}, "end": {"line": 117, "column": 38}}, "loc": {"start": {"line": 117, "column": 46}, "end": {"line": 117, "column": 74}}}}, "branchMap": {"0": {"loc": {"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, "type": "if", "locations": [{"start": {"line": 53, "column": 4}, "end": {"line": 55, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 61, "column": 11}, "end": {"line": 61, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 61, "column": 11}, "end": {"line": 61, "column": 40}}, {"start": {"line": 61, "column": 40}, "end": {"line": 61, "column": null}}]}, "2": {"loc": {"start": {"line": 70, "column": 4}, "end": {"line": 72, "column": null}}, "type": "if", "locations": [{"start": {"line": 70, "column": 4}, "end": {"line": 72, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, "type": "if", "locations": [{"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 85, "column": 4}, "end": {"line": 89, "column": null}}, "type": "if", "locations": [{"start": {"line": 85, "column": 4}, "end": {"line": 89, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 94, "column": 4}, "end": {"line": 100, "column": null}}, "type": "if", "locations": [{"start": {"line": 94, "column": 4}, "end": {"line": 100, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 107, "column": 17}, "end": {"line": 107, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 107, "column": 17}, "end": {"line": 107, "column": 49}}, {"start": {"line": 107, "column": 49}, "end": {"line": 107, "column": null}}]}, "7": {"loc": {"start": {"line": 109, "column": 4}, "end": {"line": 115, "column": null}}, "type": "if", "locations": [{"start": {"line": 109, "column": 4}, "end": {"line": 115, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 128, "column": 17}, "end": {"line": 128, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 128, "column": 41}, "end": {"line": 128, "column": 71}}, {"start": {"line": 128, "column": 71}, "end": {"line": 128, "column": null}}]}}, "s": {"0": 14, "1": 6, "2": 8, "3": 8, "4": 30, "5": 7, "6": 7, "7": 1, "8": 7, "9": 11, "10": 7, "11": 10, "12": 2, "13": 7, "14": 2, "15": 7, "16": 11, "17": 1, "18": 7, "19": 1, "20": 7, "21": 10, "22": 7, "23": 2, "24": 2, "25": 7, "26": 10, "27": 4, "28": 7, "29": 10, "30": 7, "31": 1, "32": 1, "33": 7, "34": 10, "35": 7}, "f": {"0": 14, "1": 30, "2": 7, "3": 11, "4": 10, "5": 2, "6": 11, "7": 1, "8": 10, "9": 2, "10": 10, "11": 4, "12": 10, "13": 1, "14": 10}, "b": {"0": [6, 8], "1": [30, 24], "2": [1, 6], "3": [2, 5], "4": [1, 6], "5": [2, 5], "6": [10, 8], "7": [1, 6], "8": [4, 3]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/authorizer.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/authorizer.ts", "statementMap": {"0": {"start": {"line": 11, "column": 4}, "end": {"line": 13, "column": null}}, "1": {"start": {"line": 12, "column": 8}, "end": {"line": 12, "column": null}}, "2": {"start": {"line": 14, "column": 4}, "end": {"line": 14, "column": null}}, "3": {"start": {"line": 27, "column": 30}, "end": {"line": 27, "column": null}}, "4": {"start": {"line": 28, "column": 27}, "end": {"line": 28, "column": null}}, "5": {"start": {"line": 36, "column": 4}, "end": {"line": 36, "column": null}}, "6": {"start": {"line": 43, "column": 20}, "end": {"line": 43, "column": null}}, "7": {"start": {"line": 44, "column": 20}, "end": {"line": 44, "column": null}}, "8": {"start": {"line": 46, "column": 4}, "end": {"line": 60, "column": null}}, "9": {"start": {"line": 59, "column": 8}, "end": {"line": 59, "column": null}}, "10": {"start": {"line": 62, "column": 25}, "end": {"line": 64, "column": null}}, "11": {"start": {"line": 63, "column": 19}, "end": {"line": 63, "column": null}}, "12": {"start": {"line": 65, "column": 4}, "end": {"line": 67, "column": null}}, "13": {"start": {"line": 66, "column": 8}, "end": {"line": 66, "column": null}}, "14": {"start": {"line": 70, "column": 8}, "end": {"line": 70, "column": null}}, "15": {"start": {"line": 71, "column": 4}, "end": {"line": 73, "column": null}}, "16": {"start": {"line": 72, "column": 8}, "end": {"line": 72, "column": null}}, "17": {"start": {"line": 75, "column": 4}, "end": {"line": 75, "column": null}}, "18": {"start": {"line": 114, "column": 64}, "end": {"line": 114, "column": null}}, "19": {"start": {"line": 118, "column": 44}, "end": {"line": 118, "column": null}}, "20": {"start": {"line": 120, "column": 4}, "end": {"line": 173, "column": null}}, "21": {"start": {"line": 123, "column": 8}, "end": {"line": 125, "column": null}}, "22": {"start": {"line": 124, "column": 12}, "end": {"line": 124, "column": null}}, "23": {"start": {"line": 129, "column": 33}, "end": {"line": 129, "column": null}}, "24": {"start": {"line": 130, "column": 8}, "end": {"line": 136, "column": null}}, "25": {"start": {"line": 131, "column": 12}, "end": {"line": 134, "column": null}}, "26": {"start": {"line": 135, "column": 12}, "end": {"line": 135, "column": null}}, "27": {"start": {"line": 141, "column": 32}, "end": {"line": 141, "column": null}}, "28": {"start": {"line": 142, "column": 8}, "end": {"line": 144, "column": null}}, "29": {"start": {"line": 143, "column": 12}, "end": {"line": 143, "column": null}}, "30": {"start": {"line": 145, "column": 8}, "end": {"line": 145, "column": null}}, "31": {"start": {"line": 148, "column": 8}, "end": {"line": 161, "column": null}}, "32": {"start": {"line": 149, "column": 12}, "end": {"line": 149, "column": null}}, "33": {"start": {"line": 150, "column": 28}, "end": {"line": 157, "column": null}}, "34": {"start": {"line": 158, "column": 12}, "end": {"line": 160, "column": null}}, "35": {"start": {"line": 159, "column": 16}, "end": {"line": 159, "column": null}}, "36": {"start": {"line": 162, "column": 8}, "end": {"line": 162, "column": null}}, "37": {"start": {"line": 164, "column": 58}, "end": {"line": 166, "column": null}}, "38": {"start": {"line": 167, "column": 8}, "end": {"line": 169, "column": null}}, "39": {"start": {"line": 168, "column": 12}, "end": {"line": 168, "column": null}}, "40": {"start": {"line": 170, "column": 8}, "end": {"line": 170, "column": null}}, "41": {"start": {"line": 171, "column": 8}, "end": {"line": 171, "column": null}}, "42": {"start": {"line": 172, "column": 8}, "end": {"line": 172, "column": null}}}, "fnMap": {"0": {"name": "toErrorString", "decl": {"start": {"line": 10, "column": 9}, "end": {"line": 10, "column": 23}}, "loc": {"start": {"line": 10, "column": 47}, "end": {"line": 15, "column": null}}}, "1": {"name": "isNonBlank", "decl": {"start": {"line": 35, "column": 9}, "end": {"line": 35, "column": 20}}, "loc": {"start": {"line": 35, "column": 53}, "end": {"line": 37, "column": null}}}, "2": {"name": "extractBashCommandEvidence", "decl": {"start": {"line": 40, "column": 9}, "end": {"line": 40, "column": null}}, "loc": {"start": {"line": 42, "column": 35}, "end": {"line": 76, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 63, "column": 8}, "end": {"line": 63, "column": 9}}, "loc": {"start": {"line": 63, "column": 19}, "end": {"line": 63, "column": null}}}, "4": {"name": "authorizeInnerCommand", "decl": {"start": {"line": 111, "column": 22}, "end": {"line": 111, "column": null}}, "loc": {"start": {"line": 113, "column": 30}, "end": {"line": 174, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 11, "column": 4}, "end": {"line": 13, "column": null}}, "type": "if", "locations": [{"start": {"line": 11, "column": 4}, "end": {"line": 13, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 36, "column": 11}, "end": {"line": 36, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 36, "column": 11}, "end": {"line": 36, "column": 40}}, {"start": {"line": 36, "column": 40}, "end": {"line": 36, "column": null}}]}, "2": {"loc": {"start": {"line": 46, "column": 4}, "end": {"line": 60, "column": null}}, "type": "if", "locations": [{"start": {"line": 46, "column": 4}, "end": {"line": 60, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 47, "column": 8}, "end": {"line": 57, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 47, "column": 8}, "end": {"line": 47, "column": null}}, {"start": {"line": 48, "column": 8}, "end": {"line": 48, "column": null}}, {"start": {"line": 49, "column": 8}, "end": {"line": 49, "column": null}}, {"start": {"line": 50, "column": 8}, "end": {"line": 50, "column": null}}, {"start": {"line": 51, "column": 8}, "end": {"line": 51, "column": null}}, {"start": {"line": 52, "column": 8}, "end": {"line": 52, "column": null}}, {"start": {"line": 53, "column": 8}, "end": {"line": 53, "column": null}}, {"start": {"line": 54, "column": 8}, "end": {"line": 54, "column": null}}, {"start": {"line": 55, "column": 8}, "end": {"line": 55, "column": null}}, {"start": {"line": 56, "column": 8}, "end": {"line": 56, "column": null}}, {"start": {"line": 57, "column": 9}, "end": {"line": 57, "column": 42}}, {"start": {"line": 57, "column": 42}, "end": {"line": 57, "column": null}}]}, "4": {"loc": {"start": {"line": 65, "column": 4}, "end": {"line": 67, "column": null}}, "type": "if", "locations": [{"start": {"line": 65, "column": 4}, "end": {"line": 67, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 70, "column": 8}, "end": {"line": 70, "column": null}}, "type": "cond-expr", "locations": [{"start": {"line": 70, "column": 36}, "end": {"line": 70, "column": 52}}, {"start": {"line": 70, "column": 52}, "end": {"line": 70, "column": null}}]}, "6": {"loc": {"start": {"line": 71, "column": 4}, "end": {"line": 73, "column": null}}, "type": "if", "locations": [{"start": {"line": 71, "column": 4}, "end": {"line": 73, "column": null}}, {"start": {}, "end": {}}]}, "7": {"loc": {"start": {"line": 123, "column": 8}, "end": {"line": 125, "column": null}}, "type": "if", "locations": [{"start": {"line": 123, "column": 8}, "end": {"line": 125, "column": null}}, {"start": {}, "end": {}}]}, "8": {"loc": {"start": {"line": 130, "column": 8}, "end": {"line": 136, "column": null}}, "type": "if", "locations": [{"start": {"line": 130, "column": 8}, "end": {"line": 136, "column": null}}, {"start": {}, "end": {}}]}, "9": {"loc": {"start": {"line": 142, "column": 8}, "end": {"line": 144, "column": null}}, "type": "if", "locations": [{"start": {"line": 142, "column": 8}, "end": {"line": 144, "column": null}}, {"start": {}, "end": {}}]}, "10": {"loc": {"start": {"line": 158, "column": 12}, "end": {"line": 160, "column": null}}, "type": "if", "locations": [{"start": {"line": 158, "column": 12}, "end": {"line": 160, "column": null}}, {"start": {}, "end": {}}]}, "11": {"loc": {"start": {"line": 167, "column": 8}, "end": {"line": 169, "column": null}}, "type": "if", "locations": [{"start": {"line": 167, "column": 8}, "end": {"line": 169, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 3, "1": 3, "2": 0, "3": 2, "4": 2, "5": 45, "6": 32, "7": 32, "8": 32, "9": 9, "10": 22, "11": 7, "12": 22, "13": 1, "14": 21, "15": 21, "16": 2, "17": 19, "18": 37, "19": 37, "20": 37, "21": 37, "22": 3, "23": 34, "24": 33, "25": 1, "26": 1, "27": 32, "28": 31, "29": 12, "30": 19, "31": 19, "32": 28, "33": 28, "34": 27, "35": 15, "36": 3, "37": 3, "38": 3, "39": 1, "40": 3, "41": 3, "42": 3}, "f": {"0": 3, "1": 45, "2": 32, "3": 7, "4": 37}, "b": {"0": [3, 0], "1": [45, 44], "2": [9, 22], "3": [32, 31, 29, 29, 29, 28, 27, 27, 25, 24, 23, 23], "4": [1, 21], "5": [16, 5], "6": [2, 19], "7": [3, 34], "8": [1, 32], "9": [12, 19], "10": [15, 12], "11": [1, 2]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/index.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/index.ts", "statementMap": {"0": {"start": {"line": 8, "column": 18}, "end": {"line": 8, "column": null}}, "1": {"start": {"line": 31, "column": 8}, "end": {"line": 33, "column": null}}, "2": {"start": {"line": 32, "column": 12}, "end": {"line": 32, "column": null}}, "3": {"start": {"line": 35, "column": 24}, "end": {"line": 35, "column": null}}, "4": {"start": {"line": 36, "column": 8}, "end": {"line": 38, "column": null}}, "5": {"start": {"line": 37, "column": 12}, "end": {"line": 37, "column": null}}, "6": {"start": {"line": 40, "column": 39}, "end": {"line": 40, "column": null}}, "7": {"start": {"line": 41, "column": 8}, "end": {"line": 51, "column": null}}, "8": {"start": {"line": 44, "column": 16}, "end": {"line": 50, "column": null}}, "9": {"start": {"line": 54, "column": 4}, "end": {"line": 72, "column": null}}, "10": {"start": {"line": 58, "column": 8}, "end": {"line": 60, "column": null}}, "11": {"start": {"line": 59, "column": 12}, "end": {"line": 59, "column": null}}, "12": {"start": {"line": 65, "column": 26}, "end": {"line": 65, "column": null}}, "13": {"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, "14": {"start": {"line": 67, "column": 12}, "end": {"line": 67, "column": null}}, "15": {"start": {"line": 70, "column": 8}, "end": {"line": 70, "column": null}}, "16": {"start": {"line": 71, "column": 8}, "end": {"line": 71, "column": null}}, "17": {"start": {"line": 74, "column": 4}, "end": {"line": 76, "column": null}}, "18": {"start": {"line": 75, "column": 8}, "end": {"line": 75, "column": null}}, "19": {"start": {"line": 78, "column": 4}, "end": {"line": 82, "column": null}}, "20": {"start": {"line": 79, "column": 8}, "end": {"line": 79, "column": null}}, "21": {"start": {"line": 80, "column": 8}, "end": {"line": 80, "column": null}}, "22": {"start": {"line": 81, "column": 8}, "end": {"line": 81, "column": null}}}, "fnMap": {"0": {"name": "permissionInnerCmd", "decl": {"start": {"line": 16, "column": 24}, "end": {"line": 16, "column": 43}}, "loc": {"start": {"line": 16, "column": 67}, "end": {"line": 83, "column": null}}}, "1": {"name": "tryRegister", "decl": {"start": {"line": 30, "column": 13}, "end": {"line": 30, "column": 33}}, "loc": {"start": {"line": 30, "column": 33}, "end": {"line": 52, "column": null}}}, "2": {"name": "(anonymous_2)", "decl": {"start": {"line": 43, "column": 12}, "end": {"line": 43, "column": 19}}, "loc": {"start": {"line": 44, "column": 16}, "end": {"line": 50, "column": null}}}, "3": {"name": "(anonymous_3)", "decl": {"start": {"line": 54, "column": 27}, "end": {"line": 54, "column": 28}}, "loc": {"start": {"line": 54, "column": 44}, "end": {"line": 72, "column": 5}}}, "4": {"name": "(anonymous_4)", "decl": {"start": {"line": 74, "column": 44}, "end": {"line": 74, "column": 50}}, "loc": {"start": {"line": 74, "column": 50}, "end": {"line": 76, "column": 5}}}, "5": {"name": "(anonymous_5)", "decl": {"start": {"line": 78, "column": 30}, "end": {"line": 78, "column": 36}}, "loc": {"start": {"line": 78, "column": 36}, "end": {"line": 82, "column": 5}}}}, "branchMap": {"0": {"loc": {"start": {"line": 31, "column": 8}, "end": {"line": 33, "column": null}}, "type": "if", "locations": [{"start": {"line": 31, "column": 8}, "end": {"line": 33, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 31, "column": 12}, "end": {"line": 31, "column": 47}}, "type": "binary-expr", "locations": [{"start": {"line": 31, "column": 12}, "end": {"line": 31, "column": 33}}, {"start": {"line": 31, "column": 33}, "end": {"line": 31, "column": 47}}]}, "2": {"loc": {"start": {"line": 36, "column": 8}, "end": {"line": 38, "column": null}}, "type": "if", "locations": [{"start": {"line": 36, "column": 8}, "end": {"line": 38, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 58, "column": 8}, "end": {"line": 60, "column": null}}, "type": "if", "locations": [{"start": {"line": 58, "column": 8}, "end": {"line": 60, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, "type": "if", "locations": [{"start": {"line": 66, "column": 8}, "end": {"line": 68, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 1, "1": 16, "2": 5, "3": 11, "4": 11, "5": 5, "6": 6, "7": 6, "8": 1, "9": 9, "10": 9, "11": 1, "12": 8, "13": 8, "14": 1, "15": 7, "16": 7, "17": 9, "18": 9, "19": 9, "20": 1, "21": 1, "22": 1}, "f": {"0": 9, "1": 16, "2": 1, "3": 9, "4": 9, "5": 1}, "b": {"0": [5, 11], "1": [16, 14], "2": [5, 6], "3": [1, 8], "4": [1, 7]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/recognizer.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/recognizer.ts", "statementMap": {"0": {"start": {"line": 22, "column": 4}, "end": {"line": 22, "column": null}}, "1": {"start": {"line": 25, "column": 30}, "end": {"line": 25, "column": null}}, "2": {"start": {"line": 42, "column": 18}, "end": {"line": 42, "column": null}}, "3": {"start": {"line": 43, "column": 4}, "end": {"line": 45, "column": null}}, "4": {"start": {"line": 44, "column": 8}, "end": {"line": 44, "column": null}}, "5": {"start": {"line": 46, "column": 4}, "end": {"line": 49, "column": null}}, "6": {"start": {"line": 57, "column": 4}, "end": {"line": 57, "column": null}}, "7": {"start": {"line": 77, "column": 18}, "end": {"line": 77, "column": null}}, "8": {"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, "9": {"start": {"line": 79, "column": 8}, "end": {"line": 79, "column": null}}, "10": {"start": {"line": 81, "column": 4}, "end": {"line": 83, "column": null}}, "11": {"start": {"line": 82, "column": 8}, "end": {"line": 82, "column": null}}, "12": {"start": {"line": 84, "column": 4}, "end": {"line": 84, "column": null}}}, "fnMap": {"0": {"name": "parseTimeoutWrapper", "decl": {"start": {"line": 39, "column": 16}, "end": {"line": 39, "column": null}}, "loc": {"start": {"line": 41, "column": 35}, "end": {"line": 50, "column": null}}}, "1": {"name": "isRecognizedWrapper", "decl": {"start": {"line": 56, "column": 16}, "end": {"line": 56, "column": 36}}, "loc": {"start": {"line": 56, "column": 62}, "end": {"line": 58, "column": null}}}, "2": {"name": "classifyWrapper", "decl": {"start": {"line": 76, "column": 16}, "end": {"line": 76, "column": 32}}, "loc": {"start": {"line": 76, "column": 72}, "end": {"line": 85, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 43, "column": 4}, "end": {"line": 45, "column": null}}, "type": "if", "locations": [{"start": {"line": 43, "column": 4}, "end": {"line": 45, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, "type": "if", "locations": [{"start": {"line": 78, "column": 4}, "end": {"line": 80, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 81, "column": 4}, "end": {"line": 83, "column": null}}, "type": "if", "locations": [{"start": {"line": 81, "column": 4}, "end": {"line": 83, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 3, "1": 3, "2": 68, "3": 68, "4": 40, "5": 28, "6": 17, "7": 7, "8": 7, "9": 1, "10": 6, "11": 3, "12": 3}, "f": {"0": 68, "1": 17, "2": 7}, "b": {"0": [40, 28], "1": [1, 6], "2": [3, 3]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/env.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/env.ts", "statementMap": {"0": {"start": {"line": 4, "column": 19}, "end": {"line": 4, "column": null}}, "1": {"start": {"line": 16, "column": 42}, "end": {"line": 25, "column": null}}, "2": {"start": {"line": 19, "column": 8}, "end": {"line": 21, "column": null}}, "3": {"start": {"line": 20, "column": 12}, "end": {"line": 20, "column": null}}, "4": {"start": {"line": 22, "column": 8}, "end": {"line": 22, "column": null}}, "5": {"start": {"line": 23, "column": 8}, "end": {"line": 23, "column": null}}}, "fnMap": {"0": {"name": "(anonymous_0)", "decl": {"start": {"line": 18, "column": 4}, "end": {"line": 18, "column": 11}}, "loc": {"start": {"line": 18, "column": 29}, "end": {"line": 24, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 19, "column": 8}, "end": {"line": 21, "column": null}}, "type": "if", "locations": [{"start": {"line": 19, "column": 8}, "end": {"line": 21, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 5, "3": 4, "4": 1, "5": 1}, "f": {"0": 5}, "b": {"0": [4, 1]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/index.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/index.ts", "statementMap": {"0": {"start": {"line": 11, "column": 51}, "end": {"line": 15, "column": null}}}, "fnMap": {}, "branchMap": {}, "s": {"0": 2}, "f": {}, "b": {}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/timeout.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/timeout.ts", "statementMap": {"0": {"start": {"line": 9, "column": 21}, "end": {"line": 9, "column": null}}, "1": {"start": {"line": 22, "column": 18}, "end": {"line": 22, "column": null}}, "2": {"start": {"line": 23, "column": 4}, "end": {"line": 25, "column": null}}, "3": {"start": {"line": 24, "column": 8}, "end": {"line": 24, "column": null}}, "4": {"start": {"line": 26, "column": 4}, "end": {"line": 28, "column": null}}, "5": {"start": {"line": 27, "column": 8}, "end": {"line": 27, "column": null}}, "6": {"start": {"line": 29, "column": 4}, "end": {"line": 32, "column": null}}, "7": {"start": {"line": 50, "column": 46}, "end": {"line": 135, "column": null}}, "8": {"start": {"line": 60, "column": 12}, "end": {"line": 60, "column": null}}, "9": {"start": {"line": 62, "column": 26}, "end": {"line": 62, "column": null}}, "10": {"start": {"line": 63, "column": 8}, "end": {"line": 73, "column": null}}, "11": {"start": {"line": 66, "column": 12}, "end": {"line": 71, "column": null}}, "12": {"start": {"line": 67, "column": 16}, "end": {"line": 69, "column": null}}, "13": {"start": {"line": 70, "column": 16}, "end": {"line": 70, "column": null}}, "14": {"start": {"line": 72, "column": 12}, "end": {"line": 72, "column": null}}, "15": {"start": {"line": 75, "column": 29}, "end": {"line": 75, "column": null}}, "16": {"start": {"line": 76, "column": 8}, "end": {"line": 76, "column": null}}, "17": {"start": {"line": 79, "column": 8}, "end": {"line": 85, "column": null}}, "18": {"start": {"line": 80, "column": 12}, "end": {"line": 83, "column": null}}, "19": {"start": {"line": 84, "column": 12}, "end": {"line": 84, "column": null}}, "20": {"start": {"line": 89, "column": 30}, "end": {"line": 93, "column": null}}, "21": {"start": {"line": 94, "column": 8}, "end": {"line": 99, "column": null}}, "22": {"start": {"line": 95, "column": 12}, "end": {"line": 97, "column": null}}, "23": {"start": {"line": 98, "column": 12}, "end": {"line": 98, "column": null}}, "24": {"start": {"line": 104, "column": 23}, "end": {"line": 108, "column": null}}, "25": {"start": {"line": 109, "column": 8}, "end": {"line": 133, "column": null}}, "26": {"start": {"line": 113, "column": 16}, "end": {"line": 117, "column": null}}, "27": {"start": {"line": 118, "column": 16}, "end": {"line": 118, "column": null}}, "28": {"start": {"line": 120, "column": 16}, "end": {"line": 124, "column": null}}, "29": {"start": {"line": 125, "column": 16}, "end": {"line": 125, "column": null}}, "30": {"start": {"line": 128, "column": 16}, "end": {"line": 131, "column": null}}, "31": {"start": {"line": 132, "column": 16}, "end": {"line": 132, "column": null}}}, "fnMap": {"0": {"name": "stripWrapperUnit", "decl": {"start": {"line": 17, "column": 9}, "end": {"line": 17, "column": null}}, "loc": {"start": {"line": 21, "column": 22}, "end": {"line": 34, "column": null}}}, "1": {"name": "(anonymous_1)", "decl": {"start": {"line": 52, "column": 4}, "end": {"line": 52, "column": 11}}, "loc": {"start": {"line": 52, "column": 16}, "end": {"line": 134, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 23, "column": 4}, "end": {"line": 25, "column": null}}, "type": "if", "locations": [{"start": {"line": 23, "column": 4}, "end": {"line": 25, "column": null}}, {"start": {}, "end": {}}]}, "1": {"loc": {"start": {"line": 26, "column": 4}, "end": {"line": 28, "column": null}}, "type": "if", "locations": [{"start": {"line": 26, "column": 4}, "end": {"line": 28, "column": null}}, {"start": {}, "end": {}}]}, "2": {"loc": {"start": {"line": 63, "column": 8}, "end": {"line": 73, "column": null}}, "type": "if", "locations": [{"start": {"line": 63, "column": 8}, "end": {"line": 73, "column": null}}, {"start": {}, "end": {}}]}, "3": {"loc": {"start": {"line": 66, "column": 12}, "end": {"line": 71, "column": null}}, "type": "if", "locations": [{"start": {"line": 66, "column": 12}, "end": {"line": 71, "column": null}}, {"start": {}, "end": {}}]}, "4": {"loc": {"start": {"line": 79, "column": 8}, "end": {"line": 85, "column": null}}, "type": "if", "locations": [{"start": {"line": 79, "column": 8}, "end": {"line": 85, "column": null}}, {"start": {}, "end": {}}]}, "5": {"loc": {"start": {"line": 94, "column": 8}, "end": {"line": 99, "column": null}}, "type": "if", "locations": [{"start": {"line": 94, "column": 8}, "end": {"line": 99, "column": null}}, {"start": {}, "end": {}}]}, "6": {"loc": {"start": {"line": 107, "column": 12}, "end": {"line": 107, "column": null}}, "type": "binary-expr", "locations": [{"start": {"line": 107, "column": 12}, "end": {"line": 107, "column": 33}}, {"start": {"line": 107, "column": 33}, "end": {"line": 107, "column": null}}]}, "7": {"loc": {"start": {"line": 109, "column": 8}, "end": {"line": 133, "column": null}}, "type": "switch", "locations": [{"start": {"line": 110, "column": 12}, "end": {"line": 118, "column": null}}, {"start": {"line": 119, "column": 12}, "end": {"line": 125, "column": null}}, {"start": {"line": 126, "column": 12}, "end": {"line": 126, "column": null}}, {"start": {"line": 127, "column": 12}, "end": {"line": 132, "column": null}}]}}, "s": {"0": 2, "1": 12, "2": 12, "3": 1, "4": 11, "5": 0, "6": 11, "7": 2, "8": 19, "9": 19, "10": 19, "11": 6, "12": 1, "13": 1, "14": 5, "15": 13, "16": 13, "17": 13, "18": 1, "19": 1, "20": 12, "21": 12, "22": 1, "23": 1, "24": 11, "25": 10, "26": 5, "27": 5, "28": 1, "29": 1, "30": 4, "31": 4}, "f": {"0": 12, "1": 19}, "b": {"0": [1, 11], "1": [0, 11], "2": [6, 13], "3": [1, 5], "4": [1, 12], "5": [1, 11], "6": [11, 10], "7": [5, 1, 4, 4]}}, "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/xargs.ts": {"path": "/home/sikongjueluo/Projects/pi-extensions/packages/pi-permission-inner-cmd/src/handlers/xargs.ts", "statementMap": {"0": {"start": {"line": 4, "column": 21}, "end": {"line": 4, "column": null}}, "1": {"start": {"line": 18, "column": 44}, "end": {"line": 27, "column": null}}, "2": {"start": {"line": 21, "column": 8}, "end": {"line": 23, "column": null}}, "3": {"start": {"line": 22, "column": 12}, "end": {"line": 22, "column": null}}, "4": {"start": {"line": 24, "column": 8}, "end": {"line": 24, "column": null}}, "5": {"start": {"line": 25, "column": 8}, "end": {"line": 25, "column": null}}}, "fnMap": {"0": {"name": "(anonymous_0)", "decl": {"start": {"line": 20, "column": 4}, "end": {"line": 20, "column": 11}}, "loc": {"start": {"line": 20, "column": 29}, "end": {"line": 26, "column": null}}}}, "branchMap": {"0": {"loc": {"start": {"line": 21, "column": 8}, "end": {"line": 23, "column": null}}, "type": "if", "locations": [{"start": {"line": 21, "column": 8}, "end": {"line": 23, "column": null}}, {"start": {}, "end": {}}]}}, "s": {"0": 2, "1": 2, "2": 4, "3": 3, "4": 1, "5": 1}, "f": {"0": 4}, "b": {"0": [3, 1]}}} \ No newline at end of file diff --git a/packages/pi-permission-ai-judge/package.json b/packages/pi-permission-ai-judge/package.json index d4c01c8..48347f1 100644 --- a/packages/pi-permission-ai-judge/package.json +++ b/packages/pi-permission-ai-judge/package.json @@ -21,6 +21,8 @@ "@earendil-works/pi-coding-agent": "*", "@gotgenes/pi-permission-system": ">=25.4.0", "@types/node": "^26.0.0", + "@vitest/coverage-istanbul": "3.2.7", + "@vitest/coverage-v8": "^3.2.7", "typescript": "^5", "vitest": "^3" }, diff --git a/packages/pi-permission-ai-judge/src/analyzer/analyze.ts b/packages/pi-permission-ai-judge/src/analyzer/analyze.ts index 38553b5..680df47 100644 --- a/packages/pi-permission-ai-judge/src/analyzer/analyze.ts +++ b/packages/pi-permission-ai-judge/src/analyzer/analyze.ts @@ -411,24 +411,73 @@ export function analyzeShadowReviewLog(events: readonly ReviewEvent[]): AnalyzeR }; } -function computeMetrics( - n: number, - joined: readonly JoinedRow[], - quarantined: Record, -): Metrics { - const matrix: Record = {}; +/** Per-kind tallies collected in one pass over the joined rows. */ +interface RowTallies { + readonly joinedJudgments: number; + readonly falseAllows: number; + readonly conservativeDeny: number; + readonly conservativeDefer: number; + readonly humanAllowJudgments: number; + readonly preflightDefers: number; + readonly infrastructureFailures: number; + readonly infraByCode: Record; + /** Comparison matrix [ai|human] over attributable judgment rows. */ + readonly matrix: Record; + readonly judgeLatencies: Array; + readonly modelLatencies: Array; +} + +/** Counters accumulated over attributable judgment rows. */ +interface MatrixCounters { + matrix: Record; + falseAllows: number; + conservativeDeny: number; + conservativeDefer: number; + humanAllowJudgments: number; +} + +/** + * Tally one attributable judgment row into the comparison matrix and the + * conservative-direction counters. Unattributable rows never reach here. + */ +function tallyAttributable(row: JoinedRow, c: MatrixCounters): void { + const key = `${row.verdict ?? "null"}|${row.human.decision}`; + c.matrix[key] = (c.matrix[key] ?? 0) + 1; + if (row.human.decision === "allow") { + c.humanAllowJudgments += 1; + } + if (row.verdict === "allow" && row.human.decision === "deny") { + c.falseAllows += 1; + } + if (row.verdict === "deny" && row.human.decision === "allow") { + c.conservativeDeny += 1; + } + if (row.verdict === "defer" && row.human.decision === "allow") { + c.conservativeDefer += 1; + } +} + +/** + * One pass over joined rows: latencies are collected for every row; + * non-judgment rows (preflight/infra) are tallied and excluded; judgment + * rows enter the comparison matrix unless their human attribution is + * `unproven` (those stay joined but never enter the matrix). + */ +function tallyJoinedRows(joined: readonly JoinedRow[]): RowTallies { const infraByCode: Record = {}; - const judgeLatencies: Array = []; + const judgeLatencies: Array = []; const modelLatencies: Array = []; let joinedJudgments = 0; - let attributed = 0; - let falseAllows = 0; - let conservativeDeny = 0; - let conservativeDefer = 0; - let humanAllowJudgments = 0; let preflightDefers = 0; let infrastructureFailures = 0; + const counters: MatrixCounters = { + matrix: {}, + falseAllows: 0, + conservativeDeny: 0, + conservativeDefer: 0, + humanAllowJudgments: 0, + }; for (const row of joined) { judgeLatencies.push(row.judgeLatencyMs); @@ -447,63 +496,65 @@ function computeMetrics( break; } joinedJudgments += 1; - if (row.humanAttribution === "unproven") { - continue; - } - attributed += 1; - const key = `${row.verdict ?? "null"}|${row.human.decision}`; - matrix[key] = (matrix[key] ?? 0) + 1; - if (row.human.decision === "allow") { - humanAllowJudgments += 1; - } - if (row.verdict === "allow" && row.human.decision === "deny") { - falseAllows += 1; - } - if (row.verdict === "deny" && row.human.decision === "allow") { - conservativeDeny += 1; - } - if (row.verdict === "defer" && row.human.decision === "allow") { - conservativeDefer += 1; + if (row.humanAttribution !== "unproven") { + tallyAttributable(row, counters); } } - const completionCoverage = n > 0 ? (joined.length + missingResults(n, joined)) / n : 0; + return { + joinedJudgments, + falseAllows: counters.falseAllows, + conservativeDeny: counters.conservativeDeny, + conservativeDefer: counters.conservativeDefer, + humanAllowJudgments: counters.humanAllowJudgments, + preflightDefers, + infrastructureFailures, + infraByCode, + matrix: counters.matrix, + judgeLatencies, + modelLatencies, + }; +} + +function computeMetrics( + n: number, + joined: readonly JoinedRow[], + quarantined: Record, +): Metrics { + const t = tallyJoinedRows(joined); return { joined: joined.length, quarantined, - joinedJudgments, + joinedJudgments: t.joinedJudgments, completionCoverage: joined.length / (n || 1), - humanJoinCoverage: (joined.length - quarantinedCount(joined)) / (n || 1), - judgmentCoverage: joinedJudgments / (n || 1), - matrix, - falseAllows, - falseAllowRate: falseAllows > 0 || hasAllowPrediction(matrix) - ? falseAllows / allowPredictions(matrix) + humanJoinCoverage: (joined.length - unprovenCount(joined)) / (n || 1), + judgmentCoverage: t.joinedJudgments / (n || 1), + matrix: t.matrix, + falseAllows: t.falseAllows, + falseAllowRate: t.falseAllows > 0 || hasAllowPrediction(t.matrix) + ? t.falseAllows / allowPredictions(t.matrix) : null, - conservativeDeny, - conservativeDefer, + conservativeDeny: t.conservativeDeny, + conservativeDefer: t.conservativeDefer, conservativeRate: - humanAllowJudgments > 0 - ? (conservativeDeny + conservativeDefer) / humanAllowJudgments + t.humanAllowJudgments > 0 + ? (t.conservativeDeny + t.conservativeDefer) / t.humanAllowJudgments : null, - preflightDefers, - infrastructureFailures, - infrastructureByCode: infraByCode, - judgeLatency: latencyStats(judgeLatencies), - modelLatency: latencyStats(modelLatencies), + preflightDefers: t.preflightDefers, + infrastructureFailures: t.infrastructureFailures, + infrastructureByCode: t.infraByCode, + judgeLatency: latencyStats(t.judgeLatencies), + modelLatency: latencyStats(t.modelLatencies), }; } // ── helper functions below exist to keep computeMetrics readable; they are // not part of the public surface. -function missingResults(n: number, joined: readonly JoinedRow[]): number { - return Math.max(0, n - joined.length); -} -function quarantinedCount(joined: readonly JoinedRow[]): number { - // Quarantined rows are tracked outside `joined`; in this simplified - // metric path the human-join coverage counts joined rows with an - // attributable human outcome. +function unprovenCount(joined: readonly JoinedRow[]): number { + // The human-join coverage counts joined rows with an + // attributable human outcome; `unproven` rows are joined but + // never attributable. return joined.filter((r) => r.humanAttribution === "unproven").length; } diff --git a/packages/pi-permission-ai-judge/src/analyzer/cli.ts b/packages/pi-permission-ai-judge/src/analyzer/cli.ts index b6816ed..dc5dad8 100644 --- a/packages/pi-permission-ai-judge/src/analyzer/cli.ts +++ b/packages/pi-permission-ai-judge/src/analyzer/cli.ts @@ -8,6 +8,7 @@ */ import { readFileSync } from "node:fs"; +import { pathToFileURL } from "node:url"; import { analyzeShadowReviewLog, type ReviewEvent } from "./analyze"; const USAGE = `usage: analyze-shadow [options] @@ -32,7 +33,23 @@ interface CliOptions { readonly audit: string | null; } -function parseArgs(argv: readonly string[]): CliOptions | { error: string } { +/** Parse one `--after`/`--before` timestamp value; error string on failure. */ +export function parseTimestampOption( + arg: string, + value: string | undefined, +): { date: Date } | { error: string } { + if (value === undefined) { + return { error: `${arg} requires a value` }; + } + const date = new Date(value); + if (Number.isNaN(date.getTime())) { + return { error: `invalid ${arg} timestamp: ${value}` }; + } + return { date }; +} + +/** Parse CLI options; exported for in-process tests. */ +export function parseArgs(argv: readonly string[]): CliOptions | { error: string } { const args = argv.slice(2); let path: string | undefined; let after: Date | null = null; @@ -43,24 +60,24 @@ function parseArgs(argv: readonly string[]): CliOptions | { error: string } { if (arg === "--help" || arg === "-h") { return { error: USAGE }; } - if (arg === "--after" || arg === "--before" || arg === "--audit") { + if (arg === "--audit") { const value = args[i + 1]; if (value === undefined) { return { error: `${arg} requires a value` }; } - if (arg === "--audit") { - audit = value; - i += 1; - continue; - } - const parsed = new Date(value); - if (Number.isNaN(parsed.getTime())) { - return { error: `invalid ${arg} timestamp: ${value}` }; + audit = value; + i += 1; + continue; + } + if (arg === "--after" || arg === "--before") { + const parsed = parseTimestampOption(arg, args[i + 1]); + if ("error" in parsed) { + return parsed; } if (arg === "--after") { - after = parsed; + after = parsed.date; } else { - before = parsed; + before = parsed.date; } i += 1; continue; @@ -112,6 +129,63 @@ function fmtLatency(stats: { return `p50=${stats.p50}ms p95=${stats.p95}ms max=${stats.max}ms missing=${stats.missing}`; } +/** Parse one review-log JSONL file, skipping blank/unparseable lines. */ +function loadReviewEvents(path: string): ReviewEvent[] { + let raw: string; + try { + raw = readFileSync(path, "utf-8"); + } catch (error) { + process.stderr.write( + `error: cannot read ${path}: ${error instanceof Error ? error.message : String(error)}\n`, + ); + process.exit(1); + } + return raw + .split("\n") + .map((line, index) => parseLine(line, index + 1)) + .filter((evt): evt is ReviewEvent => evt !== null); +} + +/** The `--after`/`--before` selection window; exported for tests. */ +export interface TimeWindow { + readonly after: Date | null; + readonly before: Date | null; +} + +/** True when an event's timestamp falls inside the window (or is absent). */ +export function withinWindow(evt: ReviewEvent, window: TimeWindow): boolean { + const ts = typeof evt.timestamp === "string" ? evt.timestamp : null; + if (ts === null) { + return true; + } + const time = new Date(ts).getTime(); + if (window.after !== null && !Number.isNaN(time) && time < window.after.getTime()) { + return false; + } + if (window.before !== null && !Number.isNaN(time) && time > window.before.getTime()) { + return false; + } + return true; +} + +/** + * ADR 0006 dual-log mode: with --audit, the denominator comes from the + * Judge's own enrolled rows (asks it received), rewritten as synthetic + * enrollment events so the reconstructed permission-system enrollment + * proxy can be dropped to avoid a second denominator source. Human + * decisions still come from the permission log (attribution join). + */ +function loadAuditEnrolled(auditPath: string, window: TimeWindow): ReviewEvent[] { + return loadReviewEvents(auditPath) + .filter((evt) => evt.event === "ai_bash_judge.enrolled") + .filter((evt) => withinWindow(evt, window)) + .map((evt) => ({ + ...evt, + event: "authorizer_chain_resolved", + links: ["ai-bash-judge"], + }) as ReviewEvent); +} + function main(): void { const parsed = parseArgs(process.argv); if ("error" in parsed) { @@ -119,75 +193,13 @@ function main(): void { process.exit(parsed.error === USAGE ? 0 : 1); } - let raw: string; - try { - raw = readFileSync(parsed.path, "utf-8"); - } catch (error) { - process.stderr.write( - `error: cannot read ${parsed.path}: ${error instanceof Error ? error.message : String(error)}\n`, - ); - process.exit(1); - } - - const events = raw - .split("\n") - .map((line, index) => parseLine(line, index + 1)) - .filter((evt): evt is ReviewEvent => evt !== null) - .filter((evt) => { - const ts = typeof evt.timestamp === "string" ? evt.timestamp : null; - if (ts === null) { - return true; - } - const time = new Date(ts).getTime(); - if (parsed.after !== null && !Number.isNaN(time) && time < parsed.after.getTime()) { - return false; - } - if (parsed.before !== null && !Number.isNaN(time) && time > parsed.before.getTime()) { - return false; - } - return true; - }); - - // ADR 0006 dual-log mode: with --audit, the denominator comes from the - // Judge's own enrolled rows (asks it received), and the reconstructed - // permission-system enrollment proxy is dropped to avoid a second - // denominator source. Human decisions still come from the permission - // log (attribution join). + const window: TimeWindow = { after: parsed.after, before: parsed.before }; + const events = loadReviewEvents(parsed.path).filter((evt) => + withinWindow(evt, window), + ); let joined = events; if (parsed.audit !== null) { - let auditRaw: string; - try { - auditRaw = readFileSync(parsed.audit, "utf-8"); - } catch (error) { - process.stderr.write( - `error: cannot read audit log ${parsed.audit}: ${error instanceof Error ? error.message : String(error)}\n`, - ); - process.exit(1); - } - const auditEnrolled = auditRaw - .split("\n") - .map((line, index) => parseLine(line, index + 1)) - .filter((evt): evt is ReviewEvent => evt !== null) - .filter((evt) => evt.event === "ai_bash_judge.enrolled") - .filter((evt) => { - const ts = typeof evt.timestamp === "string" ? evt.timestamp : null; - if (ts === null) { - return true; - } - const time = new Date(ts).getTime(); - if (parsed.after !== null && !Number.isNaN(time) && time < parsed.after.getTime()) { - return false; - } - if (parsed.before !== null && !Number.isNaN(time) && time > parsed.before.getTime()) { - return false; - } - return true; - }) - .map((evt) => ({ - ...evt, - event: "authorizer_chain_resolved", - links: ["ai-bash-judge"], - }) as ReviewEvent); + const auditEnrolled = loadAuditEnrolled(parsed.audit, window); joined = [ ...events.filter((evt) => evt.event !== "authorizer_chain_resolved"), ...auditEnrolled, @@ -195,6 +207,14 @@ function main(): void { } const { enrollments, metrics } = analyzeShadowReviewLog(joined); + printReport(parsed, enrollments, metrics); +} + +export function printReport( + parsed: CliOptions, + enrollments: number, + metrics: ReturnType["metrics"], +): void { const out = process.stdout; out.write("AI Bash Judge — Shadow diagnostic report\n"); @@ -253,4 +273,11 @@ function main(): void { out.write(`model latency: ${fmtLatency(metrics.modelLatency)}\n`); } -main(); +// Run as a script only (not under vitest imports): same guard as +// tools/corpus-replay.ts. +if ( + process.argv[1] !== undefined && + import.meta.url === pathToFileURL(process.argv[1]).href +) { + main(); +} diff --git a/packages/pi-permission-ai-judge/src/conversation.ts b/packages/pi-permission-ai-judge/src/conversation.ts index 19895cb..f9829fd 100644 --- a/packages/pi-permission-ai-judge/src/conversation.ts +++ b/packages/pi-permission-ai-judge/src/conversation.ts @@ -92,22 +92,20 @@ function userTextFrom(message: unknown): string | null { } /** - * Build bounded conversation evidence from the active branch. - * - * Iterates entries newest-first to guarantee latest-user preservation, - * then reverses for newest-last output. Head/middle/tail truncation: with - * more items than fit, the newest `MAX_CONVERSATION_ITEMS` are kept and - * `truncated` is set — the head is the part dropped, which keeps the most - * recent intent window intact and matches "latest-user preservation". + * Newest-first user texts from the active branch, bounded by + * MAX_CONVERSATION_ITEMS. Compaction boundaries are flagged, not kept. */ -export function buildConversationEvidence( - probe: ConversationProbe, -): ConversationEvidence { - const entries = probe.getActiveEntries(); +function collectUserTexts( + entries: readonly unknown[], +): { texts: string[]; hasCompaction: boolean } { const collected: string[] = []; let hasCompaction = false; - for (let i = entries.length - 1; i >= 0 && collected.length < MAX_CONVERSATION_ITEMS; i -= 1) { + for ( + let i = entries.length - 1; + i >= 0 && collected.length < MAX_CONVERSATION_ITEMS; + i -= 1 + ) { const entry = entries[i]; if (!isRecord(entry)) { continue; @@ -124,6 +122,39 @@ export function buildConversationEvidence( collected.push(text); } } + return { texts: collected, hasCompaction }; +} + +/** + * Character budget: the head (oldest) drop index so the remainder fits + * within MAX_CONVERSATION_CHARS; 0 when everything fits. Always keeps at + * least the newest item. + */ +function charBudgetStart(kept: readonly string[]): number { + let rendered = 0; + for (let i = 0; i < kept.length; i += 1) { + rendered += kept[i]?.length ?? 0; + if (rendered > MAX_CONVERSATION_CHARS) { + return Math.max(1, i); + } + } + return 0; +} + +/** + * Build bounded conversation evidence from the active branch. + * + * Iterates entries newest-first to guarantee latest-user preservation, + * then reverses for newest-last output. Head/middle/tail truncation: with + * more items than fit, the newest `MAX_CONVERSATION_ITEMS` are kept and + * `truncated` is set — the head is the part dropped, which keeps the most + * recent intent window intact and matches "latest-user preservation". + */ +export function buildConversationEvidence( + probe: ConversationProbe, +): ConversationEvidence { + const entries = probe.getActiveEntries(); + const { texts: collected, hasCompaction } = collectUserTexts(entries); const kept = collected.reverse(); const totalItems = countUserEntries(entries); @@ -131,22 +162,14 @@ export function buildConversationEvidence( // Character budget: drop from the head (oldest) until it fits; the // newest items are preserved. A dropped head is recorded by `truncated`. - let rendered = 0; - let start = 0; - for (let i = 0; i < kept.length; i += 1) { - rendered += kept[i]?.length ?? 0; - if (rendered > MAX_CONVERSATION_CHARS) { - start = Math.max(1, i); // keep at least the newest item - rendered = 0; - for (let j = start; j < kept.length; j += 1) { - rendered += kept[j]?.length ?? 0; - } - break; - } - } + const start = charBudgetStart(kept); const finalItems = kept .slice(start) .map((text, index) => ({ position: index + 1, role: "user" as const, text })); + const rendered = finalItems.reduce( + (sum, item) => sum + item.text.length, + 0, + ); return { items: finalItems, diff --git a/packages/pi-permission-ai-judge/src/index.ts b/packages/pi-permission-ai-judge/src/index.ts index 52af57f..0c4d1a0 100644 --- a/packages/pi-permission-ai-judge/src/index.ts +++ b/packages/pi-permission-ai-judge/src/index.ts @@ -11,7 +11,7 @@ import { type AuthorizerLog, type AuthorizerVerdict, } from "@gotgenes/pi-permission-system"; -import { buildBashJudgmentEvidence } from "./evidence"; +import { buildBashJudgmentEvidence, type BashJudgmentEvidence } from "./evidence"; import { createModelAvailability, requestStructuredVerdict, @@ -299,6 +299,223 @@ function emitInfrastructureResult( }); } +/** + * Judge-owned enrollment record (ADR 0006 denominator: asks the Judge + * received, per its own audit log). Non-bash surfaces are ignored later + * without a shadow row; they also do not enroll (v0.1 cohort is bash-only). + */ +function auditEnrollment( + captured: RootSession, + details: PromptPermissionDetails, +): void { + if ( + details.forwarding !== undefined || + details.payload.kind === "forwarded" || + details.payload.kind === "bash" + ) { + captured.auditLog.audit("ai_bash_judge.enrolled", { + requestId: details.requestId, + origin: + details.forwarding !== undefined || + details.payload.kind === "forwarded" + ? "forwarded" + : "local", + surface: "bash", + command: + details.payload.kind === "bash" && + details.payload.request?.value + ? details.payload.request.value + : (details.command ?? null), + }); + } +} + +/** A preflight-gate outcome: proceed with usable evidence, or stop. */ +type PreflightGate = + | { + readonly kind: "proceed"; + readonly evidence: BashJudgmentEvidence; + readonly risk: HighRiskMatch | undefined; + } + | { readonly kind: "stop"; readonly verdict: AuthorizerVerdict }; + +/** + * Fail-closed preflight gates, in order: + * 1. Forwarded asks do not carry a structured child full command in + * permission-system 25.3/25.4 — never parse the legacy prose. The + * deferral is recorded so the request stays visible in the offline + * denominator instead of silently vanishing. + * 2. Unrelated permission surfaces produce no Shadow row and no model + * call: the v0.1 cohort selects accessSurface = bash only. + * 3. Session ownership must be proven. + * 4. Evidence must be structured and valid. + * 5. Built-in high-risk override (ADR 0008): clear-cut irreversible/system + * shapes always defer. In Enforce the model is skipped entirely; in + * Shadow it still runs for quality observation and the override is + * recorded. + */ +function runPreflightGates( + ctx: EmitContext, + captured: RootSession, + details: PromptPermissionDetails, +): PreflightGate { + if ( + details.forwarding !== undefined || + details.payload.kind === "forwarded" + ) { + return { + kind: "stop", + verdict: preflightDefer( + ctx, + "missing_structured_input", + evidenceQuality(false, EMPTY_CONVERSATION, "", false), + ), + }; + } + + if (details.payload.kind !== "bash") { + return { kind: "stop", verdict: { kind: "defer" } }; + } + + if (captured.getSessionId() !== captured.expectedSessionId) { + return { + kind: "stop", + verdict: preflightDefer( + ctx, + "session_ownership_unproven", + evidenceQuality(false, EMPTY_CONVERSATION, ""), + ), + }; + } + + const evidence = buildBashJudgmentEvidence(details); + if (evidence === undefined) { + return { + kind: "stop", + verdict: preflightDefer( + ctx, + "invalid_evidence", + evidenceQuality(false, EMPTY_CONVERSATION, ""), + ), + }; + } + + const risk = classifyHighRisk(evidence.fullCommand); + if (risk !== undefined && captured.config.mode === "enforce") { + return { + kind: "stop", + verdict: preflightDefer( + ctx, + "high_risk_override", + evidenceQuality(true, EMPTY_CONVERSATION, captured.getCwd()), + { riskCategory: risk.category, riskRule: risk.rule }, + ), + }; + } + + return { kind: "proceed", evidence, risk }; +} + +/** Prepared model-call inputs; undefined when an infra defer was emitted. */ +interface PreparedModelCall { + readonly availability: ModelAvailability; + readonly modelSource: "configured" | "session"; +} + +/** + * Per-request judge-model resolution (PIEXTENSIO-3 cat.3 for the session + * model; ADR 0008 for a configured fixed model). A configured model that + * cannot be resolved is an observable infrastructure failure — never a + * silent fallback to the session model. + */ +function prepareModelCall( + ctx: EmitContext, + captured: RootSession, + risk: HighRiskMatch | undefined, +): PreparedModelCall | undefined { + const resolved = resolveJudgeModel( + captured.config, + captured.getModel(), + captured.modelRegistry, + ); + if (resolved.kind === "unavailable") { + infrastructureDefer( + ctx, + "judge_model_unavailable", + evidenceQuality(true, EMPTY_CONVERSATION, captured.getCwd()), + { + provider: captured.config.judgeModel?.provider ?? null, + model: captured.config.judgeModel?.id ?? null, + api: null, + riskOverride: risk ?? null, + }, + ); + return undefined; + } + return { + availability: createModelAvailability( + resolved.model, + captured.modelRegistry, + ), + modelSource: resolved.source, + }; +} + +/** + * Enforce truth table (PIEXTENSIO-3 cat.4 / M5; ADR 0008): the fail-closed + * runtime health gates — audit health, telemetry, result kind, verdict, + * review acknowledgement, generation currency — are the single authority + * seam; the retired promotion gates are no longer inputs. + * reviewAcknowledged is true in the ADR 0006 sense: the Judge-owned audit + * write for this result happens before the authority return, and a failed + * write flips auditHealthy sticky-unhealthy, closing authority for every + * later ask. + */ +function enforceAndEmit( + ctx: EmitContext, + captured: RootSession, + sink: ReviewSink, + result: ModelAttempt, + conversation: ConversationEvidence, + risk: HighRiskMatch | undefined, + modelSource: "configured" | "session", +): AuthorizerVerdict { + const gateState: EnforceGateState = { + auditHealthy: captured.auditLog.healthy(), + telemetryHealth: sink.health(), + resultKind: + result.kind === "judgment" + ? "judgment" + : result.kind, + verdict: + result.kind === "judgment" ? result.verdict : null, + reviewAcknowledged: true, + generationCurrent: !captured.shutdown.signal.aborted, + mode: captured.config.mode, + }; + const authority = evaluateEnforceAuthority(gateState); + const effectiveVerdict = + authority.kind === "allow" ? "allow" : "defer"; + const authorityBlockedBy = + authority.kind === "allow" ? null : authority.blockedBy; + + if (result.kind === "judgment") { + emitJudgmentResult( + ctx, result, conversation, + effectiveVerdict, authorityBlockedBy, modelSource, risk, + ); + } else { + emitInfrastructureResult( + ctx, result, conversation, + effectiveVerdict, authorityBlockedBy, modelSource, risk, + ); + } + + return authority.kind === "allow" + ? { kind: "allow" } + : { kind: "defer" }; +} + /** * One authorize call: enroll, preflight-gate, judge, and enforce the truth * table. Extracted from the registerAuthorizer callback so each stage reads @@ -325,171 +542,35 @@ async function judgeAuthorize( }, }; - // Judge-owned enrollment record (ADR 0006 denominator: - // asks the Judge received, per its own audit log). - // Non-bash surfaces are ignored below without a shadow - // row; they also do not enroll (v0.1 cohort is bash-only). - if ( - details.forwarding !== undefined || - details.payload.kind === "forwarded" || - details.payload.kind === "bash" - ) { - captured.auditLog.audit("ai_bash_judge.enrolled", { - requestId: details.requestId, - origin: - details.forwarding !== undefined || - details.payload.kind === "forwarded" - ? "forwarded" - : "local", - surface: "bash", - command: - details.payload.kind === "bash" && - details.payload.request?.value - ? details.payload.request.value - : (details.command ?? null), - }); - } - // Forwarded asks do not carry a structured child full - // command in permission-system 25.3/25.4. Never parse the - // legacy prose. The deferral is recorded so the request - // stays visible in the offline denominator instead of - // silently vanishing. - if ( - details.forwarding !== undefined || - details.payload.kind === "forwarded" - ) { - return preflightDefer( - ctx, - "missing_structured_input", - evidenceQuality(false, EMPTY_CONVERSATION, "", false), - ); + auditEnrollment(captured, details); + + const gate = runPreflightGates(ctx, captured, details); + if (gate.kind === "stop") { + return gate.verdict; } - // Ignore unrelated permission surfaces without producing a - // Shadow row or invoking the model: the v0.1 cohort selects - // accessSurface = bash only. - if (details.payload.kind !== "bash") { + const prepared = prepareModelCall(ctx, captured, gate.risk); + if (prepared === undefined) { return { kind: "defer" }; } - if (captured.getSessionId() !== captured.expectedSessionId) { - return preflightDefer( - ctx, - "session_ownership_unproven", - evidenceQuality(false, EMPTY_CONVERSATION, ""), - ); - } - - const evidence = buildBashJudgmentEvidence(details); - if (evidence === undefined) { - return preflightDefer( - ctx, - "invalid_evidence", - evidenceQuality(false, EMPTY_CONVERSATION, ""), - ); - } - - // Built-in high-risk override (ADR 0008): clear-cut - // irreversible/system shapes always defer. In Enforce the - // model is skipped entirely; in Shadow it still runs for - // quality observation and the override is recorded. - const risk: HighRiskMatch | undefined = classifyHighRisk( - evidence.fullCommand, - ); - if (risk !== undefined && captured.config.mode === "enforce") { - return preflightDefer( - ctx, - "high_risk_override", - evidenceQuality(true, EMPTY_CONVERSATION, captured.getCwd()), - { riskCategory: risk.category, riskRule: risk.rule }, - ); - } - - // Per-request judge-model resolution (PIEXTENSIO-3 cat.3 - // for the session model; ADR 0008 for a configured fixed - // model). A configured model that cannot be resolved is - // an observable infrastructure failure — never a silent - // fallback to the session model. - const resolved = resolveJudgeModel( - captured.config, - captured.getModel(), - captured.modelRegistry, - ); - if (resolved.kind === "unavailable") { - return infrastructureDefer( - ctx, - "judge_model_unavailable", - evidenceQuality(true, EMPTY_CONVERSATION, captured.getCwd()), - { - provider: captured.config.judgeModel?.provider ?? null, - model: captured.config.judgeModel?.id ?? null, - api: null, - riskOverride: risk ?? null, - }, - ); - } - const modelSource = resolved.source; - const availability: ModelAvailability = createModelAvailability( - resolved.model, - captured.modelRegistry, - ); // Conversation evidence is captured at ask time from the // live serving branch, not at session start: the newest // user intent is the ask's intent. const conversation: ConversationEvidence = buildConversationEvidence(captured.conversation); const result = await requestStructuredVerdict( - availability, - evidence, + prepared.availability, + gate.evidence, captured.shutdown.signal, captured.config.timeoutMs, conversation, ); - // Enforce truth table (PIEXTENSIO-3 cat.4 / M5; ADR 0008): - // the fail-closed runtime health gates — audit health, - // telemetry, result kind, verdict, review - // acknowledgement, generation currency — are the single - // authority seam; the retired promotion gates are no - // longer inputs. reviewAcknowledged is true in the ADR - // 0006 sense: the Judge-owned audit write for this result - // happens before the authority return, and a failed write - // flips auditHealthy sticky-unhealthy, closing authority - // for every later ask. - const gateState: EnforceGateState = { - auditHealthy: captured.auditLog.healthy(), - telemetryHealth: sink.health(), - resultKind: - result.kind === "judgment" - ? "judgment" - : result.kind, - verdict: - result.kind === "judgment" ? result.verdict : null, - reviewAcknowledged: true, - generationCurrent: !captured.shutdown.signal.aborted, - mode: captured.config.mode, - }; - const authority = evaluateEnforceAuthority(gateState); - const effectiveVerdict = - authority.kind === "allow" ? "allow" : "defer"; - const authorityBlockedBy = - authority.kind === "allow" ? null : authority.blockedBy; - - if (result.kind === "judgment") { - emitJudgmentResult( - ctx, result, conversation, - effectiveVerdict, authorityBlockedBy, modelSource, risk, - ); - } else { - emitInfrastructureResult( - ctx, result, conversation, - effectiveVerdict, authorityBlockedBy, modelSource, risk, - ); - } - - return authority.kind === "allow" - ? { kind: "allow" } - : { kind: "defer" }; + return enforceAndEmit( + ctx, captured, sink, result, conversation, gate.risk, + prepared.modelSource, + ); } catch { // A link exception would abort the whole authority chain. // Keep provider/payload/session failures fail-closed and do diff --git a/packages/pi-permission-ai-judge/src/model.ts b/packages/pi-permission-ai-judge/src/model.ts index 1923cca..db96fc3 100644 --- a/packages/pi-permission-ai-judge/src/model.ts +++ b/packages/pi-permission-ai-judge/src/model.ts @@ -159,6 +159,72 @@ function codePointLength(value: string): number { return [...value].length; } +/** The completion type produced by a ready availability. */ +type VerdictResponse = Awaited< + ReturnType["complete"]> +>; + +/** Validation outcome for one completion response. */ +type ValidatedVerdict = + | { + readonly kind: "judgment"; + readonly verdict: SemanticVerdict; + readonly reason: string; + } + | { readonly kind: "invalid"; readonly code: InfrastructureCode }; + +/** + * Validate one completion response against the report_verdict contract: + * bounded output usage, exactly one report_verdict tool call, exactly the + * {verdict, reason} argument shape, and a non-empty reason within the + * code-point bound. + */ +function validateVerdictResponse(response: VerdictResponse): ValidatedVerdict { + const outputTokens = response.usage.output; + if ( + !Number.isFinite(outputTokens) || + outputTokens <= 0 || + outputTokens > MAX_OUTPUT_TOKENS + ) { + return { kind: "invalid", code: "model_error" }; + } + + const calls = response.content.filter( + (part) => part.type === "toolCall", + ); + if ( + calls.length !== 1 || + calls[0]?.name !== REPORT_VERDICT_TOOL_NAME + ) { + return { kind: "invalid", code: "missing_tool_call" }; + } + + const args = calls[0].arguments; + if (args === null || typeof args !== "object" || Array.isArray(args)) { + return { kind: "invalid", code: "invalid_arguments" }; + } + const keys = Object.keys(args).sort(); + if (keys.length !== 2 || keys[0] !== "reason" || keys[1] !== "verdict") { + return { kind: "invalid", code: "invalid_arguments" }; + } + if (!isVerdict(args.verdict)) { + return { kind: "invalid", code: "invalid_verdict" }; + } + if (typeof args.reason !== "string") { + return { kind: "invalid", code: "invalid_reason" }; + } + + const reason = args.reason.trim(); + if ( + reason.length === 0 || + codePointLength(reason) > MAX_REASON_CODE_POINTS + ) { + return { kind: "invalid", code: "invalid_reason" }; + } + + return { kind: "judgment", verdict: args.verdict, reason }; +} + /** Make one bounded completion and accept only one `report_verdict` tool call. */ export async function requestStructuredVerdict( availability: ModelAvailability, @@ -232,59 +298,26 @@ export async function requestStructuredVerdict( return failure("model_error"); } - const outputTokens = response.usage.output; + // Usage is observed before validation so failure rows carry the + // telemetry of the response that failed the contract. const inputTokens = response.usage.input; + const outputTokens = response.usage.output; if (Number.isFinite(inputTokens)) { observedInputTokens = inputTokens; } if (Number.isFinite(outputTokens)) { observedOutputTokens = outputTokens; } - if ( - !Number.isFinite(outputTokens) || - outputTokens <= 0 || - outputTokens > MAX_OUTPUT_TOKENS - ) { - return failure("model_error"); - } - const calls = response.content.filter( - (part) => part.type === "toolCall", - ); - if ( - calls.length !== 1 || - calls[0]?.name !== REPORT_VERDICT_TOOL_NAME - ) { - return failure("missing_tool_call"); - } - - const args = calls[0].arguments; - if (args === null || typeof args !== "object" || Array.isArray(args)) { - return failure("invalid_arguments"); - } - const keys = Object.keys(args).sort(); - if (keys.length !== 2 || keys[0] !== "reason" || keys[1] !== "verdict") { - return failure("invalid_arguments"); - } - if (!isVerdict(args.verdict)) { - return failure("invalid_verdict"); - } - if (typeof args.reason !== "string") { - return failure("invalid_reason"); - } - - const reason = args.reason.trim(); - if ( - reason.length === 0 || - codePointLength(reason) > MAX_REASON_CODE_POINTS - ) { - return failure("invalid_reason"); + const validated = validateVerdictResponse(response); + if (validated.kind === "invalid") { + return failure(validated.code); } return { kind: "judgment", - verdict: args.verdict, - reason, + verdict: validated.verdict, + reason: validated.reason, metadata: availability.metadata, inputTokens: observedInputTokens, outputTokens, diff --git a/packages/pi-permission-ai-judge/test/analyzer/cli-args.test.ts b/packages/pi-permission-ai-judge/test/analyzer/cli-args.test.ts new file mode 100644 index 0000000..76f485f --- /dev/null +++ b/packages/pi-permission-ai-judge/test/analyzer/cli-args.test.ts @@ -0,0 +1,292 @@ +import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { spawnSync } from "node:child_process"; +import { afterEach, describe, expect, it } from "vitest"; + +/** + * CLI-level tests for arg parsing (`parseArgs`), the `--after`/`--before` + * time window (`withinWindow`), and report rendering (`printReport`). + * Invalid-arg cases assert the exit contract (stderr + exit 1) that the + * analyze-shadow CLI documents. + */ + +const dirs: string[] = []; + +function tmp(): string { + const dir = mkdtempSync(join(tmpdir(), "ai-judge-cli-args-")); + dirs.push(dir); + return dir; +} + +afterEach(() => { + for (const dir of dirs.splice(0)) { + rmSync(dir, { recursive: true, force: true }); + } +}); + +interface RunResult { + readonly stdout: string; + readonly stderr: string; + readonly status: number; +} + +function runExpect(args: readonly string[]): RunResult { + const cli = join(import.meta.dirname, "..", "..", "src", "analyzer", "cli.ts"); + const r = spawnSync("npx", ["tsx", cli, ...args], { + encoding: "utf-8", + stdio: ["ignore", "pipe", "pipe"], + }); + return { + stdout: r.stdout ?? "", + stderr: r.stderr ?? "", + status: r.status ?? -1, + }; +} + +function reviewLog(dir: string, lines: readonly object[]): string { + const path = join(dir, "review.jsonl"); + writeFileSync( + path, + lines.map((l) => JSON.stringify(l)).join("\n") + "\n", + ); + return path; +} + +describe("analyze-shadow CLI — argument parsing (parseArgs)", () => { + it("prints usage and exits 0 for --help and -h", () => { + for (const flag of ["--help", "-h"]) { + const r = runExpect([flag]); + expect(r.status).toBe(0); + expect(r.stdout.length + r.stderr.length).toBeGreaterThan(0); + } + }); + + it("rejects missing input path with exit 1", () => { + const r = runExpect([]); + expect(r.status).toBe(1); + expect(r.stderr).toContain("missing input path"); + }); + + it("rejects multiple input paths with exit 1", () => { + const dir = tmp(); + const a = reviewLog(dir, []); + const b = reviewLog(dir, []).replace("review", "review2"); + const r = runExpect([a, b]); + expect(r.status).toBe(1); + expect(r.stderr).toContain("multiple input paths"); + }); + + it("rejects unknown options with exit 1", () => { + const dir = tmp(); + const path = reviewLog(dir, []); + const r = runExpect([path, "--bogus"]); + expect(r.status).toBe(1); + expect(r.stderr).toContain("unknown option: --bogus"); + }); + + it("rejects --after/--before/--audit without a value", () => { + const dir = tmp(); + const path = reviewLog(dir, []); + for (const flag of ["--after", "--before", "--audit"]) { + const r = runExpect([path, flag]); + expect(r.status).toBe(1); + expect(r.stderr).toContain(`${flag} requires a value`); + } + }); + + it("rejects invalid --after/--before timestamps", () => { + const dir = tmp(); + const path = reviewLog(dir, []); + for (const flag of ["--after", "--before"]) { + const r = runExpect([path, flag, "not-a-timestamp"]); + expect(r.status).toBe(1); + expect(r.stderr).toContain(`invalid ${flag} timestamp`); + } + }); +}); + +describe("analyze-shadow CLI — time window (withinWindow)", () => { + const events = (ts: string) => [ + { + timestamp: ts, + event: "authorizer_chain_resolved", + requestId: "req-1", + links: ["ai-bash-judge"], + }, + { + timestamp: ts, + event: "ai_bash_judge.result", + requestId: "req-1", + resultKind: "judgment", + verdict: "allow", + }, + { + timestamp: ts, + event: "permission_request.approved", + requestId: "req-1", + resolution: "approved", + }, + ]; + + it("keeps events inside --after..--before and drops events outside", () => { + const dir = tmp(); + const path = reviewLog(dir, [ + ...events("2026-08-18T00:00:05Z"), // inside + ...events("2026-08-18T00:00:01Z").map((e, i) => ({ ...e, requestId: `req-old-${i}` })), // before + ...events("2026-08-18T23:00:00Z").map((e, i) => ({ ...e, requestId: `req-new-${i}` })), // after + ]); + const r = runExpect([ + path, + "--after", "2026-08-18T00:00:02Z", + "--before", "2026-08-18T12:00:00Z", + ]); + expect(r.status).toBe(0); + expect(r.stdout).toContain("enrollments (N): 1"); + expect(r.stdout).toContain("joined rows: 1"); + }); + + it("keeps events with a missing timestamp regardless of the window", () => { + const dir = tmp(); + // First event has no timestamp: survives any window. + const path = reviewLog(dir, [ + { + event: "authorizer_chain_resolved", + requestId: "req-1", + links: ["ai-bash-judge"], + }, + ...events("2026-08-18T00:00:05Z").slice(1), + ]); + const r = runExpect([ + path, + "--after", "2026-08-18T00:00:02Z", + ]); + expect(r.status).toBe(0); + expect(r.stdout).toContain("enrollments (N): 1"); + }); +}); + +describe("analyze-shadow CLI — report rendering (printReport)", () => { + function joinedLog(dir: string): string { + return reviewLog(dir, [ + { + timestamp: "2026-08-18T00:00:01Z", + event: "authorizer_chain_resolved", + requestId: "req-1", + links: ["ai-bash-judge"], + }, + { + timestamp: "2026-08-18T00:00:02Z", + event: "ai_bash_judge.result", + requestId: "req-1", + resultKind: "judgment", + verdict: "allow", + judgeLatencyMs: 5, + modelLatencyMs: 3, + }, + { + timestamp: "2026-08-18T00:00:03Z", + event: "permission_request.approved", + requestId: "req-1", + resolution: "approved", + }, + { + timestamp: "2026-08-18T00:00:04Z", + event: "authorizer_chain_resolved", + requestId: "req-2", + links: ["ai-bash-judge"], + }, + { + timestamp: "2026-08-18T00:00:05Z", + event: "ai_bash_judge.result", + requestId: "req-2", + resultKind: "judgment", + verdict: "deny", + code: null, + judgeLatencyMs: 7, + modelLatencyMs: 4, + }, + { + timestamp: "2026-08-18T00:00:06Z", + event: "permission_request.approved", + requestId: "req-2", + resolution: "approved", + }, + ]); + } + + it("renders the comparison matrix and counters for mixed judgment rows", () => { + const dir = tmp(); + const r = runExpect([joinedLog(dir)]); + expect(r.status).toBe(0); + // Header + source echo. + expect(r.stdout).toContain("AI Bash Judge — Shadow diagnostic report"); + expect(r.stdout).toContain("grade: DIAGNOSTIC"); + expect(r.stdout).toContain("source:"); + // Denominator + join counts. + expect(r.stdout).toContain("enrollments (N): 2"); + expect(r.stdout).toContain("joined rows: 2"); + expect(r.stdout).toContain("joined judgments: 2"); + // Matrix rows for both verdicts (allow|allow, deny|allow). + expect(r.stdout).toContain("allow|allow: 1"); + expect(r.stdout).toContain("deny|allow: 1"); + // Conservative deny counter incremented by deny|allow. + expect(r.stdout).toContain("conservative: deny 1, defer 0"); + // Latency lines rendered with p50/p95/max/missing. + expect(r.stdout).toMatch(/judge latency: p50=\d+ms p95=\d+ms/); + expect(r.stdout).toMatch(/model latency: p50=\d+ms p95=\d+ms/); + // No --audit: the audit source line must be absent. + expect(r.stdout).not.toContain("(enrollment source, ADR 0006)"); + }); + + it("renders an empty matrix placeholder and no quarantine section when clean", () => { + const dir = tmp(); + const r = runExpect([joinedLog(dir)]); + expect(r.status).toBe(0); + expect(r.stdout).not.toContain("quarantined rows:"); + // Build an empty log: no events at all — matrix stays empty. + const empty = reviewLog(dir, []); + const r2 = runExpect([empty]); + expect(r2.status).toBe(0); + expect(r2.stdout).toContain("comparison matrix [verdict|human]:"); + expect(r2.stdout).toContain("(empty)"); + expect(r2.stdout).toContain("N/A"); + }); + + it("renders the quarantine section with category counts", () => { + const dir = tmp(); + // Two results for one request → duplicate_result quarantine. + const path = reviewLog(dir, [ + { + timestamp: "2026-08-18T00:00:01Z", + event: "authorizer_chain_resolved", + requestId: "req-1", + links: ["ai-bash-judge"], + }, + { + timestamp: "2026-08-18T00:00:02Z", + event: "ai_bash_judge.result", + requestId: "req-1", + resultKind: "judgment", + verdict: "allow", + }, + { + timestamp: "2026-08-18T00:00:03Z", + event: "ai_bash_judge.result", + requestId: "req-1", + resultKind: "judgment", + verdict: "deny", + }, + { + timestamp: "2026-08-18T00:00:04Z", + event: "permission_request.approved", + requestId: "req-1", + resolution: "approved", + }, + ]); + const r = runExpect([path]); + expect(r.status).toBe(0); + expect(r.stdout).toContain("quarantined rows:"); + expect(r.stdout).toContain("duplicate_result: 1"); + }); +}); diff --git a/packages/pi-permission-ai-judge/test/analyzer/cli-unit.test.ts b/packages/pi-permission-ai-judge/test/analyzer/cli-unit.test.ts new file mode 100644 index 0000000..0f1c913 --- /dev/null +++ b/packages/pi-permission-ai-judge/test/analyzer/cli-unit.test.ts @@ -0,0 +1,214 @@ +import { describe, expect, it, vi } from "vitest"; +import type { ReviewEvent } from "../../src/analyzer/analyze"; +import { analyzeShadowReviewLog } from "../../src/analyzer/analyze"; +import { + parseArgs, + parseTimestampOption, + printReport, + withinWindow, +} from "../../src/analyzer/cli"; + +/** + * In-process unit tests for the analyze-shadow CLI's pure helpers: + * argument parsing, the time-window filter, and report rendering. The + * end-to-end contract (file IO, dual-log mode, exit codes) lives in + * cli-args.test.ts / cli-audit.test.ts; these tests cover branch-level + * behavior without spawning tsx subprocesses. + */ + +describe("parseArgs", () => { + it("parses the positional path with no options", () => { + expect(parseArgs(["node", "cli.ts", "review.jsonl"])).toEqual({ + path: "review.jsonl", + after: null, + before: null, + audit: null, + }); + }); + + it("parses --after, --before, and --audit together", () => { + const r = parseArgs([ + "node", + "cli.ts", + "review.jsonl", + "--after", "2026-08-18T00:00:00Z", + "--before", "2026-08-19T00:00:00Z", + "--audit", "audit.jsonl", + ]); + expect(r).toEqual({ + path: "review.jsonl", + after: new Date("2026-08-18T00:00:00Z"), + before: new Date("2026-08-19T00:00:00Z"), + audit: "audit.jsonl", + }); + }); + + it("returns the usage error for --help and -h", () => { + expect(parseArgs(["node", "cli.ts", "--help"])).toEqual({ + error: expect.stringContaining("usage: analyze-shadow") as unknown, + }); + expect(parseArgs(["node", "cli.ts", "-h"])).toHaveProperty("error"); + }); + + it.each([ + ["missing input path", [] as const], + ["multiple input paths", ["a.jsonl", "b.jsonl"] as const], + ["unknown option", ["a.jsonl", "--bogus"] as const], + ["--audit without value", ["a.jsonl", "--audit"] as const], + ["--after without value", ["a.jsonl", "--after"] as const], + ["invalid --after timestamp", ["a.jsonl", "--after", "nope"] as const], + ["invalid --before timestamp", ["a.jsonl", "--before", "nope"] as const], + ])("errors on %s", (_name, argv) => { + const r = parseArgs(["node", "cli.ts", ...argv]); + expect("error" in r && typeof r.error === "string").toBe(true); + }); +}); + +describe("parseTimestampOption", () => { + it("requires a value", () => { + expect(parseTimestampOption("--after", undefined)).toEqual({ + error: "--after requires a value", + }); + }); + + it("rejects unparseable timestamps", () => { + expect(parseTimestampOption("--before", "yesterday")).toEqual({ + error: "invalid --before timestamp: yesterday", + }); + }); + + it("accepts an ISO instant", () => { + expect(parseTimestampOption("--after", "2026-08-18T00:00:00Z")).toEqual({ + date: new Date("2026-08-18T00:00:00Z"), + }); + }); +}); + +describe("withinWindow", () => { + const evt = (timestamp?: string): ReviewEvent => + ({ event: "e", ...(timestamp === undefined ? {} : { timestamp }) }) as ReviewEvent; + + it("keeps events without a timestamp in any window", () => { + const window = { + after: new Date("2026-08-18T12:00:00Z"), + before: new Date("2026-08-18T13:00:00Z"), + }; + expect(withinWindow(evt(), window)).toBe(true); + }); + + it("keeps events inside the window and drops those outside", () => { + const window = { + after: new Date("2026-08-18T12:00:00Z"), + before: new Date("2026-08-18T13:00:00Z"), + }; + expect(withinWindow(evt("2026-08-18T12:30:00Z"), window)).toBe(true); + expect(withinWindow(evt("2026-08-18T11:59:00Z"), window)).toBe(false); + expect(withinWindow(evt("2026-08-18T13:01:00Z"), window)).toBe(false); + }); + + it("applies each bound independently", () => { + expect( + withinWindow(evt("2026-08-18T10:00:00Z"), { after: new Date("2026-08-18T09:00:00Z"), before: null }), + ).toBe(true); + expect( + withinWindow(evt("2026-08-18T10:00:00Z"), { after: null, before: new Date("2026-08-18T09:00:00Z") }), + ).toBe(false); + }); + + it("keeps events with an unparseable timestamp regardless of bounds", () => { + const window = { + after: new Date("2026-08-18T12:00:00Z"), + before: null, + }; + // Unparseable -> NaN time -> neither bound applies. + expect(withinWindow(evt("not-a-date"), window)).toBe(true); + }); +}); + +describe("printReport", () => { + function capture(fn: () => void): string { + const chunks: string[] = []; + const spy = vi + .spyOn(process.stdout, "write") + .mockImplementation(((s: unknown) => { + chunks.push(String(s)); + return true; + }) as never); + try { + fn(); + } finally { + spy.mockRestore(); + } + return chunks.join(""); + } + + const parsed = { + path: "review.jsonl", + after: null, + before: null, + audit: null, + }; + + function analyze(rows: readonly ReviewEvent[]): ReturnType< + typeof import("../../src/analyzer/analyze").analyzeShadowReviewLog + > { + return analyzeShadowReviewLog(rows); + } + + const joinedEvents: ReviewEvent[] = [ + { event: "authorizer_chain_resolved", requestId: "r1", links: ["ai-bash-judge"] }, + { + event: "ai_bash_judge.result", + requestId: "r1", + resultKind: "judgment", + verdict: "allow", + judgeLatencyMs: 5, + modelLatencyMs: 3, + }, + { event: "permission_request.approved", requestId: "r1", resolution: "approved" }, + ]; + + it("renders header, counts, matrix, and latency lines", () => { + const { enrollments, metrics } = analyze(joinedEvents); + const out = capture(() => printReport(parsed, enrollments, metrics)); + expect(out).toContain("AI Bash Judge — Shadow diagnostic report"); + expect(out).toContain("grade: DIAGNOSTIC"); + expect(out).toContain("enrollments (N): 1"); + expect(out).toContain("allow|allow: 1"); + expect(out).toMatch(/judge latency: p50=5ms/); + expect(out).not.toContain("audit:"); + expect(out).not.toContain("quarantined rows:"); + }); + + it("renders the audit source line in dual-log mode", () => { + const { enrollments, metrics } = analyze([]); + const out = capture(() => + printReport( + { ...parsed, audit: "audit.jsonl" }, + enrollments, + metrics, + ), + ); + expect(out).toContain("audit: audit.jsonl (enrollment source, ADR 0006)"); + }); + + it("renders the empty-matrix placeholder for an empty log", () => { + const { enrollments, metrics } = analyze([]); + const out = capture(() => printReport(parsed, enrollments, metrics)); + expect(out).toContain("(empty)"); + expect(out).toContain("N/A"); + }); + + it("renders quarantine categories when integrity faults exist", () => { + const duplicate: ReviewEvent[] = [ + { event: "authorizer_chain_resolved", requestId: "r1", links: ["ai-bash-judge"] }, + { event: "ai_bash_judge.result", requestId: "r1", resultKind: "judgment", verdict: "allow" }, + { event: "ai_bash_judge.result", requestId: "r1", resultKind: "judgment", verdict: "deny" }, + { event: "permission_request.approved", requestId: "r1", resolution: "approved" }, + ]; + const { enrollments, metrics } = analyze(duplicate); + const out = capture(() => printReport(parsed, enrollments, metrics)); + expect(out).toContain("quarantined rows:"); + expect(out).toContain("duplicate_result: 1"); + }); +}); diff --git a/packages/pi-permission-ai-judge/test/catalog.test.ts b/packages/pi-permission-ai-judge/test/catalog.test.ts index 8ab07a8..9ae5905 100644 --- a/packages/pi-permission-ai-judge/test/catalog.test.ts +++ b/packages/pi-permission-ai-judge/test/catalog.test.ts @@ -83,6 +83,61 @@ describe("loadModelCatalog", () => { expect(diagnostics[0]?.key).toBe("file"); expect(String(diagnostics[0]?.problem)).toMatch(/whole catalog degraded/i); }); + + it("rejects an entry per invalid field (every parseEntry branch)", () => { + const cases: readonly [name: string, entry: unknown][] = [ + ["non-object entry", "not-an-object"], + ["null entry", null], + ["array entry", [VALID_ENTRY]], + ["empty provider", { ...VALID_ENTRY, provider: " " }], + ["empty model", { ...VALID_ENTRY, model: "" }], + ["empty api", { ...VALID_ENTRY, api: "" }], + ["unknown status", { ...VALID_ENTRY, status: "experimental" }], + ["empty promptVersion", { ...VALID_ENTRY, promptVersion: "" }], + ["empty corpusVersion", { ...VALID_ENTRY, corpusVersion: "" }], + ["empty testedAt", { ...VALID_ENTRY, testedAt: "" }], + ["non-integer corpusCases", { ...VALID_ENTRY, corpusCases: 2.5 }], + ["zero corpusCases", { ...VALID_ENTRY, corpusCases: 0 }], + ["non-integer matched", { ...VALID_ENTRY, matched: 1.5 }], + ["non-integer infrastructureFailures", { ...VALID_ENTRY, infrastructureFailures: 0.5 }], + ["latencyMs not an object", { ...VALID_ENTRY, latencyMs: 3000 }], + ["latencyMs wrong type", { ...VALID_ENTRY, latencyMs: { p50: "3000", p95: null, max: null } }], + ["latencyMs missing key", { ...VALID_ENTRY, latencyMs: { p50: 1, p95: null } }], + ["empty reportPath", { ...VALID_ENTRY, reportPath: "" }], + ["blank notes", { ...VALID_ENTRY, notes: " " }], + ]; + for (const [name, entry] of cases) { + const { catalog, diagnostics } = run(depsWith(JSON.stringify({ + version: 1, + entries: [entry], + }))); + expect(catalog?.entries, name).toEqual([]); + expect(diagnostics.map((d) => d.key), name).toContain("file"); + } + }); + + it("accepts latency nulls and omits notes only when absent", () => { + const withNulls = { + ...VALID_ENTRY, + latencyMs: { p50: null, p95: null, max: null }, + }; + const { catalog } = run(depsWith(JSON.stringify({ + version: 1, + entries: [withNulls], + }))); + expect(catalog?.entries).toHaveLength(1); + expect(catalog?.entries[0]?.latencyMs).toEqual({ p50: null, p95: null, max: null }); + expect("notes" in (catalog?.entries[0] ?? {})).toBe(false); + + const withNotes = { ...VALID_ENTRY, notes: "qualifying corpus replay report" }; + const r2 = run(depsWith(JSON.stringify({ + version: 1, + entries: [withNotes], + }))); + expect(r2.catalog?.entries[0]).toMatchObject({ + notes: "qualifying corpus replay report", + }); + }); }); describe("classifyModel", () => { diff --git a/packages/pi-permission-ai-judge/test/corpus-replay-harness.test.ts b/packages/pi-permission-ai-judge/test/corpus-replay-harness.test.ts new file mode 100644 index 0000000..ccc24ef --- /dev/null +++ b/packages/pi-permission-ai-judge/test/corpus-replay-harness.test.ts @@ -0,0 +1,205 @@ +import { describe, expect, it, vi } from "vitest"; +import type { AssistantMessage, Context, Model } from "@earendil-works/pi-ai"; +import type { ModelRegistry } from "@earendil-works/pi-coding-agent"; +import { + DEFAULT_TIMEOUT_MS, + MIN_TIMEOUT_MS, + MAX_TIMEOUT_MS, +} from "../src/model"; +import { createModelAvailability } from "../src/model"; +import { + applyTimeoutOption, + replayCorpus, + selectCorpusCases, + validateCliState, + type CliOptions, +} from "../tools/corpus-replay"; + +/** + * In-process tests for the corpus-replay harness helpers: option + * application/validation, case selection, and the replay loop driven by a + * stub model availability (no registry, no network). The CLI exit contract + * lives in corpus-replay-cli.test.ts. + */ + +function state(overrides: Partial = {}): { -readonly [K in keyof CliOptions]: CliOptions[K] } { + return { + provider: "p", + model: "m", + timeoutMs: DEFAULT_TIMEOUT_MS, + cases: null, + out: null, + strict: false, + ...overrides, + }; +} + +describe("applyTimeoutOption", () => { + it.each([ + [MIN_TIMEOUT_MS, null], + [MAX_TIMEOUT_MS, null], + [DEFAULT_TIMEOUT_MS, null], + ])("accepts the boundary value %i", (value, error) => { + const s = state(); + expect(applyTimeoutOption(s, String(value))).toBe(error); + expect(s.timeoutMs).toBe(value); + }); + + it.each([ + [String(MIN_TIMEOUT_MS - 1)], + [String(MAX_TIMEOUT_MS + 1)], + ["12.5"], + ["abc"], + ])("rejects %s with the documented range error", (value) => { + const s = state(); + const r = applyTimeoutOption(s, value); + expect(r).toMatch(/--timeout-ms must be an integer in \[\d+, \d+\]/); + expect(s.timeoutMs).toBe(DEFAULT_TIMEOUT_MS); + }); + + it("rejects a missing value with the range error (the usage check lives in parseArgs)", () => { + expect(applyTimeoutOption(state(), undefined)).toMatch(/--timeout-ms must be an integer/); + }); +}); + +describe("validateCliState", () => { + it("requires both provider and model", () => { + expect(validateCliState(state({ provider: "" }))).toMatch(/^usage:/); + expect(validateCliState(state({ model: "" }))).toMatch(/^usage:/); + }); + + it("rejects --strict combined with a --case subset", () => { + expect( + validateCliState(state({ strict: true, cases: new Set(["a"]) })), + ).toContain("--strict requires the full corpus"); + }); + + it("accepts a complete valid state", () => { + expect(validateCliState(state())).toBeNull(); + }); +}); + +describe("selectCorpusCases", () => { + it("selects the full corpus when no case filter is given", () => { + const r = selectCorpusCases(null); + expect("selected" in r && r.selected.length).toBeGreaterThan(10); + }); + + it("selects exactly the requested known ids", () => { + const r = selectCorpusCases(new Set(["requested-clean", "extra-push"])); + expect("selected" in r ? r.selected.map((c) => c.id) : []).toEqual([ + "requested-clean", + "extra-push", + ]); + }); + + it("errors on unknown ids without selecting anything", () => { + const r = selectCorpusCases(new Set(["requested-clean", "no-such-case"])); + expect("error" in r && r.error).toContain("unknown case ids: no-such-case"); + }); +}); + +describe("replayCorpus", () => { + const stderrSpy = () => vi.spyOn(process.stderr, "write").mockReturnValue(true); + + function availabilityWith( + respond: () => AssistantMessage, + ): ReturnType { + const model = { + id: "m", + provider: "p", + api: "openai-codex-responses", + } as Model; + const registry = { + complete: async ( + _m: Model, + _c: Context, + _o?: Record, + ) => respond(), + } as unknown as ModelRegistry; + return createModelAvailability(model, registry); + } + + function judgment(verdict: "allow" | "deny" | "defer"): AssistantMessage { + return { + role: "assistant", + content: [ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: { verdict, reason: "stub reason" }, + }, + ], + api: "openai-codex-responses", + provider: "p", + model: "m", + stopReason: "toolUse", + usage: { + input: 10, + output: 8, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 18, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }, + timestamp: Date.now(), + } as AssistantMessage; + } + + it("counts matches over the selected cases", async () => { + const spy = stderrSpy(); + try { + // requested-clean expects allow; extra-push expects defer — one + // canned judgment cannot satisfy both, so assert row semantics + // rather than a perfect score. + const availability = availabilityWith(() => judgment("allow")); + const selected = selectCorpusCases( + new Set(["requested-clean", "extra-push"]), + ); + if (!("selected" in selected)) throw new Error("unreachable"); + const { rows, matched } = await replayCorpus( + selected.selected, + availability, + DEFAULT_TIMEOUT_MS, + new AbortController().signal, + ); + expect(rows).toHaveLength(2); + expect(matched).toBe(1); + const clean = rows.find((r) => r.case === "requested-clean"); + expect(clean).toMatchObject({ verdict: "allow", match: true }); + const push = rows.find((r) => r.case === "extra-push"); + expect(push).toMatchObject({ verdict: "allow", match: false }); + } finally { + spy.mockRestore(); + } + }); + + it("records infrastructure failures as unmatched rows", async () => { + const spy = stderrSpy(); + try { + const availability = availabilityWith(() => { + const m = judgment("allow"); + m.stopReason = "error"; + return m; + }); + const selected = selectCorpusCases(new Set(["requested-clean"])); + if (!("selected" in selected)) throw new Error("unreachable"); + const { rows, matched } = await replayCorpus( + selected.selected, + availability, + DEFAULT_TIMEOUT_MS, + new AbortController().signal, + ); + expect(rows).toHaveLength(1); + expect(rows[0]).toMatchObject({ + verdict: null, + resultKind: "infrastructure_failure", + match: false, + }); + expect(matched).toBe(0); + } finally { + spy.mockRestore(); + } + }); +}); diff --git a/packages/pi-permission-ai-judge/test/highrisk.test.ts b/packages/pi-permission-ai-judge/test/highrisk.test.ts index fd1a400..245ab99 100644 --- a/packages/pi-permission-ai-judge/test/highrisk.test.ts +++ b/packages/pi-permission-ai-judge/test/highrisk.test.ts @@ -28,9 +28,14 @@ describe("classifyHighRisk — data_loss", () => { it.each([ "git clean -nxd", "git clean -nd", + "git clean -nxfd", + "git clean -f -x -n", + "git clean -fd", + "git clean -xn", "git reset --soft HEAD~1", "git checkout main", "git checkout -- file.txt", + "git checkout . file.txt", "git restore file.txt", "rm -rf build/", "rm -rf ./dist", diff --git a/packages/pi-permission-ai-judge/test/lifecycle.test.ts b/packages/pi-permission-ai-judge/test/lifecycle.test.ts index 0b7b86f..4ff7e59 100644 --- a/packages/pi-permission-ai-judge/test/lifecycle.test.ts +++ b/packages/pi-permission-ai-judge/test/lifecycle.test.ts @@ -542,6 +542,82 @@ describe("AI judge lifecycle", () => { harness.shutdown(); }); + it("records a provider failure as an infrastructure_failure row and defers", async () => { + let authorize: Authorizer["authorize"] | undefined; + const service = { + registerAuthorizer: vi.fn((_name, callback) => { + authorize = callback; + return vi.fn(); + }), + checkPermission: vi.fn(), + getToolPermission: vi.fn(), + } as unknown as PermissionsService; + publishPermissionsService(service); + publishedService = service; + + const complete = vi.fn( + async () => { + throw new Error("provider 500"); + }, + ); + const ctx = { + hasUI: true, + sessionManager: fakeSessionManager(), + model: { + id: "test-model", + provider: "test-provider", + api: "openai-codex-responses", + } as Model, + modelRegistry: { complete }, + ui: { notify: vi.fn() }, + } as unknown as ExtensionContext; + + const harness = createFakePi(); + extension(harness.pi); + harness.start(ctx); + harness.ready(); + expect(authorize).toBeDefined(); + + const reviews: Array<{ + event: string; + details?: Record; + }> = []; + const verdict = await authorize!( + ask(), + { + checkPermission: vi.fn(), + getToolPermission: vi.fn(), + }, + { + review: (event, details) => reviews.push({ event, details }), + debug: vi.fn(), + }, + ); + + expect(verdict).toEqual({ kind: "defer" }); + expect(complete).toHaveBeenCalledTimes(1); + expect(reviews).toMatchObject([ + { + event: "ai_bash_judge.result", + details: expect.objectContaining({ + resultKind: "infrastructure_failure", + verdict: null, + effectiveVerdict: "defer", + modelCalled: true, + code: "model_error", + modelSource: "session", + riskOverride: null, + inputUsage: null, + outputUsage: null, + }), + }, + ]); + // The failure row must not leak the provider error text. + expect(JSON.stringify(reviews)).not.toContain("provider 500"); + + harness.shutdown(); + }); + it("does not register from a headless child", () => { const service = { registerAuthorizer: vi.fn(), diff --git a/packages/pi-permission-ai-judge/test/model.test.ts b/packages/pi-permission-ai-judge/test/model.test.ts index b6779eb..6e9c515 100644 --- a/packages/pi-permission-ai-judge/test/model.test.ts +++ b/packages/pi-permission-ai-judge/test/model.test.ts @@ -1,6 +1,8 @@ import { describe, expect, it, vi } from "vitest"; -import type { AssistantMessage, Context } from "@earendil-works/pi-ai"; +import type { AssistantMessage, Context, Model } from "@earendil-works/pi-ai"; +import type { ModelRegistry } from "@earendil-works/pi-coding-agent"; import { + createModelAvailability, requestStructuredVerdict, type ModelAvailability, } from "../src/model"; @@ -50,6 +52,18 @@ function ready( return { kind: "ready", metadata, complete }; } +/** A minimal valid report_verdict tool-call content block. */ +function verdictContent(): AssistantMessage["content"] { + return [ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: { verdict: "allow", reason: "bounded" }, + }, + ]; +} + const evidence = { fullCommand: "pnpm test && git push", triggeringUnit: "git push", @@ -231,6 +245,137 @@ describe("requestStructuredVerdict", () => { }); }); + it("rejects zero and non-finite output usage", async () => { + const zeroUsage = await requestStructuredVerdict( + ready(async () => + response(verdictContent(), 0), + ), + evidence, + new AbortController().signal, + ); + expect(zeroUsage).toMatchObject({ code: "model_error" }); + + const nonFiniteUsage = await requestStructuredVerdict( + ready(async () => + response(verdictContent(), Number.NaN), + ), + evidence, + new AbortController().signal, + ); + expect(nonFiniteUsage).toMatchObject({ code: "model_error" }); + }); + + it("rejects responses without exactly one report_verdict tool call", async () => { + const noCall = await requestStructuredVerdict( + ready(async () => + response([{ type: "text", text: "I would allow it." } as never]), + ), + evidence, + new AbortController().signal, + ); + expect(noCall).toMatchObject({ code: "missing_tool_call" }); + + const wrongName = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "other_tool", + arguments: { verdict: "allow", reason: "x" }, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(wrongName).toMatchObject({ code: "missing_tool_call" }); + }); + + it("rejects null and array tool-call arguments", async () => { + const nullArgs = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: null as unknown as Record, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(nullArgs).toMatchObject({ code: "invalid_arguments" }); + + const arrayArgs = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: ["allow", "x"] as unknown as Record, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(arrayArgs).toMatchObject({ code: "invalid_arguments" }); + + const missingKey = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: { verdict: "allow" }, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(missingKey).toMatchObject({ code: "invalid_arguments" }); + }); + + it("rejects non-string and blank-trimmed reasons", async () => { + const nonStringReason = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: { verdict: "defer", reason: 42 as unknown as string }, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(nonStringReason).toMatchObject({ code: "invalid_reason" }); + + const blankReason = await requestStructuredVerdict( + ready(async () => + response([ + { + type: "toolCall", + id: "call-1", + name: "report_verdict", + arguments: { verdict: "defer", reason: " " }, + }, + ]), + ), + evidence, + new AbortController().signal, + ); + expect(blankReason).toMatchObject({ code: "invalid_reason" }); + }); + it("maps the bounded deadline to timeout", async () => { const waiting = ready( async (_context, signal) => @@ -319,3 +464,92 @@ describe("requestStructuredVerdict", () => { expect(timedOut).toMatchObject({ code: "timeout" }); }); }); + +describe("createModelAvailability — per-API forced tool choice and output cap", () => { + it("returns no_model for an undefined model", () => { + expect(createModelAvailability(undefined, registryStub())).toEqual({ + kind: "no_model", + }); + }); + + it("returns unsupported_api for an unknown api", () => { + const availability = createModelAvailability( + modelWithApi("mystery-api"), + registryStub(), + ); + expect(availability).toMatchObject({ + kind: "unsupported_api", + metadata: { api: "mystery-api" }, + }); + }); + + it.each([ + // [api, expected toolChoice, enforces output cap] + ["anthropic-messages", { type: "tool", name: "report_verdict" }, true], + ["bedrock-converse-stream", { type: "tool", name: "report_verdict" }, true], + ["google-generative-ai", "any", true], + ["google-vertex", "any", true], + ["openai-completions", { type: "function", function: { name: "report_verdict" } }, true], + ["mistral-conversations", { type: "function", function: { name: "report_verdict" } }, true], + ["pi-messages", { type: "function", function: { name: "report_verdict" } }, true], + ["openai-responses", { type: "function", name: "report_verdict" }, true], + ["azure-openai-responses", { type: "function", name: "report_verdict" }, true], + // Codex supports required but not named choice, and no output cap. + ["openai-codex-responses", "required", false], + ])("maps %s to its forced tool choice and cap policy", async (api, toolChoice, cap) => { + const calls: Array> = []; + const registry = registryStub({ + complete: (_model, _context, options) => { + calls.push(options as Record); + return Promise.resolve(response(verdictContent())); + }, + }); + const availability = createModelAvailability(modelWithApi(api), registry); + expect(availability).toMatchObject({ kind: "ready", metadata: { api } }); + + if (availability.kind === "ready") { + await availability.complete({} as never, new AbortController().signal); + } + expect(calls[0]?.toolChoice).toEqual(toolChoice); + if (cap) { + expect(calls[0]?.maxTokens).toBeTypeOf("number"); + } else { + expect(calls[0]?.maxTokens).toBeUndefined(); + } + }); + + it("forwards retry and cache policy to the registry", async () => { + let seen: Record | undefined; + const registry = registryStub({ + complete: (_m, _c, options) => { + seen = options as Record; + return Promise.resolve(response(verdictContent())); + }, + }); + const availability = createModelAvailability( + modelWithApi("anthropic-messages"), + registry, + ); + if (availability.kind === "ready") { + await availability.complete({} as never, new AbortController().signal); + } + expect(seen).toMatchObject({ maxRetries: 0, cacheRetention: "none" }); + }); +}); + +function modelWithApi(api: string): Model { + return { + provider: "test-provider", + id: "test-model", + api, + } as unknown as Model; +} + +function registryStub(overrides: Partial = {}): ModelRegistry { + return { + complete: () => { + throw new Error("not called"); + }, + ...overrides, + } as unknown as ModelRegistry; +} diff --git a/packages/pi-permission-ai-judge/tools/corpus-replay.ts b/packages/pi-permission-ai-judge/tools/corpus-replay.ts index 1c2421f..cba3f7b 100644 --- a/packages/pi-permission-ai-judge/tools/corpus-replay.ts +++ b/packages/pi-permission-ai-judge/tools/corpus-replay.ts @@ -359,7 +359,8 @@ import { qualifyReplay, type ReplayRow } from "./replay-qualify"; * visibly stale. Date-based: .. */ export const CORPUS_VERSION = "2026-08-21.2"; -interface CliOptions { +/** Parsed CLI options; exported for in-process tests. */ +export interface CliOptions { provider: string; model: string; timeoutMs: number; @@ -368,122 +369,169 @@ interface CliOptions { strict: boolean; } +/** Mutable parse state; frozen into a CliOptions at the end. */ +type CliState = { -readonly [K in keyof CliOptions]: CliOptions[K] }; + +const VALUE_OPTIONS: Readonly< + Record void> +> = { + "--provider": (state, value) => { + state.provider = value; + }, + "--model": (state, value) => { + state.model = value; + }, + "--out": (state, value) => { + state.out = value; + }, + "--case": (state, value) => { + state.cases = new Set( + value.split(",").map((c) => c.trim()).filter((c) => c.length > 0), + ); + }, +}; + +/** Apply `--timeout-ms`; exported for in-process tests. */ +export function applyTimeoutOption( + state: CliState, + value: string | undefined, +): string | null { + const n = Number(value); + if ( + value === undefined || + !Number.isInteger(n) || + n < MIN_TIMEOUT_MS || + n > MAX_TIMEOUT_MS + ) { + return `--timeout-ms must be an integer in [${MIN_TIMEOUT_MS}, ${MAX_TIMEOUT_MS}]`; + } + state.timeoutMs = n; + return null; +} + +/** Cross-option validation; exported for in-process tests. */ +export function validateCliState(state: CliState): string | null { + if (state.provider === "" || state.model === "") { + return "usage: corpus-replay --provider

--model [--timeout-ms N] [--case a,b] [--out file.json] [--strict]"; + } + // Qualification is defined over the full corpus; a --case subset is + // observation-only and must never be able to report qualified. + if (state.strict && state.cases !== null) { + return "--strict requires the full corpus; --case selects an observation-only subset"; + } + return null; +} + /** Parse CLI options; exported for exit-contract tests. Any invalid * combination is an error string the caller turns into exit 1. */ export function parseArgs(argv: readonly string[]): CliOptions | { error: string } { const args = argv.slice(2); - let provider = ""; - let model = ""; - let timeoutMs = DEFAULT_TIMEOUT_MS; - let cases: ReadonlySet | null = null; - let out: string | null = null; - let strict = false; + const state: CliState = { + provider: "", + model: "", + timeoutMs: DEFAULT_TIMEOUT_MS, + cases: null, + out: null, + strict: false, + }; for (let i = 0; i < args.length; i += 1) { const arg = args[i] as string; - const value = args[i + 1]; - if (arg === "--provider" || arg === "--model" || arg === "--out" || arg === "--case") { - if (value === undefined) return { error: `${arg} requires a value` }; - if (arg === "--provider") provider = value; - if (arg === "--model") model = value; - if (arg === "--out") out = value; - if (arg === "--case") { - cases = new Set( - value.split(",").map((c) => c.trim()).filter((c) => c.length > 0), - ); + const apply = VALUE_OPTIONS[arg]; + if (apply !== undefined) { + const value = args[i + 1]; + if (value === undefined) { + return { error: `${arg} requires a value` }; } + apply(state, value); i += 1; continue; } if (arg === "--timeout-ms") { - const n = Number(value); - if ( - value === undefined || - !Number.isInteger(n) || - n < MIN_TIMEOUT_MS || - n > MAX_TIMEOUT_MS - ) { - return { error: `--timeout-ms must be an integer in [${MIN_TIMEOUT_MS}, ${MAX_TIMEOUT_MS}]` }; + const error = applyTimeoutOption(state, args[i + 1]); + if (error !== null) { + return { error }; } - timeoutMs = n; i += 1; continue; } if (arg === "--strict") { - strict = true; + state.strict = true; continue; } return { error: `unknown option: ${arg}` }; } - if (provider === "" || model === "") { - return { error: "usage: corpus-replay --provider

--model [--timeout-ms N] [--case a,b] [--out file.json] [--strict]" }; + const error = validateCliState(state); + if (error !== null) { + return { error }; } - // Qualification is defined over the full corpus; a --case subset is - // observation-only and must never be able to report qualified. - if (strict && cases !== null) { - return { - error: - "--strict requires the full corpus; --case selects an observation-only subset", - }; - } - return { provider, model, timeoutMs, cases, out, strict }; + return state; } -async function main(): Promise { - const parsed = parseArgs(process.argv); - if ("error" in parsed) { - process.stderr.write(`${parsed.error}\n`); - return 1; - } - +/** + * Resolve the replay model through the production seam: ModelRegistry + * lookup, configured-auth check, then createModelAvailability — the same + * forced-tool/output-cap path the online judge uses. + */ +async function resolveReplayModel( + provider: string, + model: string, +): Promise { const registry = new ModelRegistry(await ModelRuntime.create()); await registry.refresh(); - const model = registry.find(parsed.provider, parsed.model) as Model | undefined; - if (model === undefined) { + const found = registry.find(provider, model) as Model | undefined; + if (found === undefined) { process.stderr.write( - `error: model ${parsed.provider}/${parsed.model} not found in models.json\n`, + `error: model ${provider}/${model} not found in models.json\n`, ); return 1; } - if (!registry.hasConfiguredAuth(model)) { + if (!registry.hasConfiguredAuth(found)) { process.stderr.write( - `error: no configured auth for ${parsed.provider}/${parsed.model}\n`, + `error: no configured auth for ${provider}/${model}\n`, ); return 1; } - - // Production adapter: registry.complete through the same seam the - // online judge uses (createModelAvailability), so this harness shares - // its forced-tool/output-cap behavior. const { createModelAvailability } = await import("../src/model"); - const availability: ModelAvailability = createModelAvailability(model, registry); + const availability: ModelAvailability = createModelAvailability(found, registry); if (availability.kind !== "ready") { process.stderr.write( `error: model unavailable: ${availability.kind} (${JSON.stringify(availability.kind === "unsupported_api" ? availability.metadata : null)})\n`, ); return 1; } + return availability; +} - const shutdown = new AbortController(); - const selected = parsed.cases === null - ? CORPUS - : CORPUS.filter((c) => (parsed.cases as ReadonlySet).has(c.id)); - const unknown = parsed.cases === null - ? [] - : [...parsed.cases].filter((id) => !CORPUS.some((c) => c.id === id)); - if (unknown.length > 0) { - process.stderr.write(`error: unknown case ids: ${unknown.join(", ")}\n`); - return 1; +/** Select corpus cases by id; unknown ids are a hard error. Exported for tests. */ +export function selectCorpusCases( + cases: ReadonlySet | null, +): { selected: readonly CorpusCase[] } | { error: string } { + if (cases === null) { + return { selected: CORPUS }; } + const selected = CORPUS.filter((c) => cases.has(c.id)); + const unknown = [...cases].filter((id) => !CORPUS.some((c) => c.id === id)); + if (unknown.length > 0) { + return { error: `unknown case ids: ${unknown.join(", ")}` }; + } + return { selected }; +} +/** Replay the selected cases, printing per-case progress to stderr. Exported for tests. */ +export async function replayCorpus( + selected: readonly CorpusCase[], + availability: ModelAvailability, + timeoutMs: number, + shutdownSignal: AbortSignal, +): Promise<{ rows: ReplayRow[]; matched: number }> { const rows: ReplayRow[] = []; let matched = 0; - const startedAll = Date.now(); for (const c of selected) { const attempt = await requestStructuredVerdict( availability, c.evidence, - shutdown.signal, - parsed.timeoutMs, + shutdownSignal, + timeoutMs, c.conversation, ); let row: ReplayRow & { boundary?: string; code?: string }; @@ -515,6 +563,36 @@ async function main(): Promise { `${c.id}: ${row.verdict ?? String(row.resultKind)} (expected ${c.expected}) ${row.match ? "MATCH" : "MISS"}\n`, ); } + return { rows, matched }; +} + +async function main(): Promise { + const parsed = parseArgs(process.argv); + if ("error" in parsed) { + process.stderr.write(`${parsed.error}\n`); + return 1; + } + + const resolved = await resolveReplayModel(parsed.provider, parsed.model); + if (typeof resolved === "number") { + return resolved; + } + + const selection = selectCorpusCases(parsed.cases); + if ("error" in selection) { + process.stderr.write(`error: ${selection.error}\n`); + return 1; + } + + const shutdown = new AbortController(); + const startedAll = Date.now(); + const { rows, matched } = await replayCorpus( + selection.selected, + resolved, + parsed.timeoutMs, + shutdown.signal, + ); + const selected = selection.selected; const qualification = qualifyReplay(rows, { budgetMs: parsed.timeoutMs }); const report = { diff --git a/packages/pi-permission-inner-cmd/package.json b/packages/pi-permission-inner-cmd/package.json index 2f75ccf..2cb79d5 100644 --- a/packages/pi-permission-inner-cmd/package.json +++ b/packages/pi-permission-inner-cmd/package.json @@ -23,6 +23,8 @@ "devDependencies": { "@earendil-works/pi-coding-agent": "*", "@types/node": "^26.0.0", + "@vitest/coverage-istanbul": "3.2.7", + "@vitest/coverage-v8": "^3.2.7", "typescript": "^5", "vitest": "^3" }, diff --git a/packages/pi-permission-inner-cmd/test/authorizer.test.ts b/packages/pi-permission-inner-cmd/test/authorizer.test.ts index ce6a4dd..ee2e079 100644 --- a/packages/pi-permission-inner-cmd/test/authorizer.test.ts +++ b/packages/pi-permission-inner-cmd/test/authorizer.test.ts @@ -444,6 +444,140 @@ describe("authorizeInnerCommand — fail-closed deferrals", () => { expect(check).toEqual([]); }); + // -- extractBashCommandEvidence guard branches: every malformed shape + // of the structured payload must defer silently (fail-closed) without + // reaching the deterministic query. + + it("defers silently when payload.evidence is not an array", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, log, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + evidence: "not-an-array" as unknown as [], + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(log).toEqual([]); + expect(check).toEqual([]); + }); + + it("defers silently when payload.request is missing", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + request: undefined as unknown as (typeof details.payload)["request"], + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently when the requester was forwarded", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + request: { + ...details.payload.request, + requester: { agentName: null, forwarded: true, sessionId: "s-child" }, + }, + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently when the ask came through an invoking tool", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + request: { + ...details.payload.request, + invokedToolName: "custom_tool", + }, + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently when the request surface is not Bash", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + request: { ...details.payload.request, surface: "edit" }, + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently on a blank request value", async () => { + const details = bashDetails("call_1", null, "timeout 30s pnpm test"); + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { + payload: { + ...details.payload, + request: { ...details.payload.request, value: " " }, + }, + }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently when the legacy command projection disagrees with the structured value", async () => { + const { verdict, check } = await run({ + recoveredCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { command: "echo different" }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + + it("defers silently on a blank full-command evidence text", async () => { + const details = bashDetails( + "call_1", + null, + "timeout 30s pnpm test", + " ", + ); + const { verdict, check } = await run({ + recoveredCommand: " ", + unitCommand: "timeout 30s pnpm test", + states: { "pnpm test": "allow" }, + details: { payload: details.payload }, + }); + expect(verdict.kind).toBe("defer"); + expect(check).toEqual([]); + }); + it("defers silently for a shell alias that re-exposes Bash", async () => { const details = bashDetails( "call_1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d66aa10..8d8fe87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,44 +219,60 @@ importers: devDependencies: '@earendil-works/pi-ai': specifier: '*' - version: 0.84.1(ws@8.21.2)(zod@4.4.3) + version: 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) '@earendil-works/pi-coding-agent': specifier: '*' - version: 0.84.1(ws@8.21.2)(zod@4.4.3) + version: 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) '@gotgenes/pi-permission-system': specifier: '>=25.4.0' - version: 25.4.0(@earendil-works/pi-coding-agent@0.84.1)(@earendil-works/pi-tui@0.84.1) + version: 25.4.0(@earendil-works/pi-coding-agent@0.84.1(supports-color@7.2.0))(@earendil-works/pi-tui@0.84.1) '@types/node': specifier: ^26.0.0 version: 26.1.2 + '@vitest/coverage-istanbul': + specifier: 3.2.7 + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0)) + '@vitest/coverage-v8': + specifier: ^3.2.7 + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0)) typescript: specifier: ^5 version: 5.9.3 vitest: specifier: ^3 - version: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) + version: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0) packages/pi-permission-inner-cmd: dependencies: '@gotgenes/pi-permission-system': specifier: ^25.4.0 - version: 25.4.0(@earendil-works/pi-coding-agent@0.84.1)(@earendil-works/pi-tui@0.84.1) + version: 25.4.0(@earendil-works/pi-coding-agent@0.84.1(supports-color@7.2.0))(@earendil-works/pi-tui@0.84.1) devDependencies: '@earendil-works/pi-coding-agent': specifier: '*' - version: 0.84.1(ws@8.21.2)(zod@4.4.3) + version: 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) '@types/node': specifier: ^26.0.0 version: 26.1.2 + '@vitest/coverage-istanbul': + specifier: 3.2.7 + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0)) + '@vitest/coverage-v8': + specifier: ^3.2.7 + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0)) typescript: specifier: ^5 version: 5.9.3 vitest: specifier: ^3 - version: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) + version: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0) packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@anthropic-ai/sdk@0.91.1': resolution: {integrity: sha512-LAmu761tSN9r66ixvmciswUj/ZC+1Q4iAfpedTfSVLeswRwnY3n2Nb6Tsk+cLPP28aLOPWeMgIuTuCcMC6W/iw==} hasBin: true @@ -363,10 +379,81 @@ packages: resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + '@earendil-works/pi-agent-core@0.84.1': resolution: {integrity: sha512-evyzXYWCLQGmcaBYHlmSku02r8qoN4SGI60GZABo6iV+H+nqX+P9ud8fEZ4GmRq9mUSREvvfX+w9dA9ThF9C6w==} engines: {node: '>=22.19.0'} @@ -609,9 +696,30 @@ packages: '@earendil-works/pi-coding-agent': '>=0.79.0' '@earendil-works/pi-tui': '>=0.79.0' + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mariozechner/clipboard-darwin-arm64@0.3.9': resolution: {integrity: sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ==} engines: {node: '>= 10'} @@ -703,6 +811,10 @@ packages: resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -1046,6 +1158,20 @@ packages: cpu: [x64] os: [win32] + '@vitest/coverage-istanbul@3.2.7': + resolution: {integrity: sha512-/o+QIJBJCBZm7FdyAMqYKvr8Cd0YsqPt9UwVT6bAA+U9Ae8AR39ZAjq7xnmKCO64TkzPm0Vvi7jzYZWLdu6Y5A==} + peerDependencies: + vitest: 3.2.7 + + '@vitest/coverage-v8@3.2.7': + resolution: {integrity: sha512-NEGWJS2XNu2PfRLQwOO3CTKj1tTETxNBdk454vDxVBhxJYhPaA/eS0nAI0c+1El1P7a60z8+i+ZrQoGESweGKg==} + peerDependencies: + '@vitest/browser': 3.2.7 + vitest: 3.2.7 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/expect@3.2.7': resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} @@ -1079,10 +1205,32 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-v8-to-istanbul@0.3.12: + resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -1090,16 +1238,29 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.11.16: + resolution: {integrity: sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==} + engines: {node: '>=6.0.0'} + hasBin: true + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -1107,6 +1268,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -1119,6 +1283,16 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1148,9 +1322,21 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + electron-to-chromium@1.5.411: + resolution: {integrity: sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1159,6 +1345,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1192,6 +1382,10 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -1209,10 +1403,19 @@ packages: resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} engines: {node: '>=18'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -1232,6 +1435,10 @@ packages: resolution: {integrity: sha512-XcJEP5dDC8liHBh52mlLjU18fNvu1ckFsu0QpIG3+APZ270fsj9wxpiA6cOURmbUEuoMVgjbC2+UYgTdCqqgzA==} engines: {node: '>=18'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -1239,6 +1446,9 @@ packages: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -1251,16 +1461,54 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -1268,6 +1516,11 @@ packages: resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} @@ -1280,13 +1533,26 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + marked@18.0.5: resolution: {integrity: sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==} engines: {node: '>= 20'} @@ -1296,6 +1562,10 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -1325,6 +1595,10 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + openai@6.26.0: resolution: {integrity: sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==} hasBin: true @@ -1341,6 +1615,9 @@ packages: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + partial-json@0.1.7: resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} @@ -1348,6 +1625,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -1393,6 +1674,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.8.0: resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} engines: {node: '>=10'} @@ -1412,6 +1697,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1422,9 +1711,33 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1481,6 +1794,12 @@ packages: resolution: {integrity: sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==} engines: {node: '>=22.19.0'} + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -1571,6 +1890,14 @@ packages: engines: {node: '>=8'} hasBin: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + ws@8.21.2: resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} engines: {node: '>=10.0.0'} @@ -1583,6 +1910,9 @@ packages: utf-8-validate: optional: true + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -1598,6 +1928,11 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@anthropic-ai/sdk@0.91.1(zod@4.4.3)': dependencies: json-schema-to-ts: 3.1.1 @@ -1818,11 +2153,113 @@ snapshots: '@aws/lambda-invoke-store@0.3.0': {} + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@7.2.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.8 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@7.2.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + '@babel/runtime@7.29.7': {} - '@earendil-works/pi-agent-core@0.84.1(ws@8.21.2)(zod@4.4.3)': + '@babel/template@7.29.7': dependencies: - '@earendil-works/pi-ai': 0.84.1(ws@8.21.2)(zod@4.4.3) + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8(supports-color@7.2.0)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3(supports-color@7.2.0) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@earendil-works/pi-agent-core@0.84.1': + dependencies: + '@earendil-works/pi-ai': 0.84.1 '@earendil-works/pi-telemetry': 0.84.1 diff: 8.0.4 ignore: 7.0.5 @@ -1836,17 +2273,55 @@ snapshots: - ws - zod - '@earendil-works/pi-ai@0.84.1(ws@8.21.2)(zod@4.4.3)': + '@earendil-works/pi-agent-core@0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3)': + dependencies: + '@earendil-works/pi-ai': 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) + '@earendil-works/pi-telemetry': 0.84.1 + diff: 8.0.4 + ignore: 7.0.5 + typebox: 1.3.7 + yaml: 2.9.0 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@earendil-works/pi-ai@0.84.1': dependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) '@aws-sdk/client-bedrock-runtime': 3.1048.0 '@earendil-works/pi-telemetry': 0.84.1 - '@google/genai': 1.52.0 + '@google/genai': 1.52.0(supports-color@7.2.0) '@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0) '@opentelemetry/api': 1.9.0 '@smithy/node-http-handler': 4.7.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) + openai: 6.26.0(ws@8.21.2)(zod@4.4.3) + partial-json: 0.1.7 + typebox: 1.3.7 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@earendil-works/pi-ai@0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3)': + dependencies: + '@anthropic-ai/sdk': 0.91.1(zod@4.4.3) + '@aws-sdk/client-bedrock-runtime': 3.1048.0 + '@earendil-works/pi-telemetry': 0.84.1 + '@google/genai': 1.52.0(supports-color@7.2.0) + '@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.0 + '@smithy/node-http-handler': 4.7.3 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) openai: 6.26.0(ws@8.21.2)(zod@4.4.3) partial-json: 0.1.7 typebox: 1.3.7 @@ -1862,10 +2337,43 @@ snapshots: dependencies: '@earendil-works/pi-protocol': 0.84.1 - '@earendil-works/pi-coding-agent@0.84.1(ws@8.21.2)(zod@4.4.3)': + '@earendil-works/pi-coding-agent@0.84.1': dependencies: - '@earendil-works/pi-agent-core': 0.84.1(ws@8.21.2)(zod@4.4.3) - '@earendil-works/pi-ai': 0.84.1(ws@8.21.2)(zod@4.4.3) + '@earendil-works/pi-agent-core': 0.84.1 + '@earendil-works/pi-ai': 0.84.1 + '@earendil-works/pi-client': 0.84.1 + '@earendil-works/pi-protocol': 0.84.1 + '@earendil-works/pi-tui': 0.84.1 + '@silvia-odwyer/photon-node': 0.3.4 + chalk: 5.6.2 + cross-spawn: 7.0.6 + diff: 8.0.4 + glob: 13.0.6 + grok-mermaid: 0.2.2 + highlight.js: 10.7.3 + hosted-git-info: 9.0.3 + ignore: 7.0.5 + jiti: 2.7.0 + minimatch: 10.2.5 + proper-lockfile: 4.1.2 + semver: 7.8.0 + typebox: 1.3.7 + undici: 8.9.0 + yaml: 2.9.0 + optionalDependencies: + '@mariozechner/clipboard': 0.3.9 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@earendil-works/pi-coding-agent@0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3)': + dependencies: + '@earendil-works/pi-agent-core': 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) + '@earendil-works/pi-ai': 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) '@earendil-works/pi-client': 0.84.1 '@earendil-works/pi-protocol': 0.84.1 '@earendil-works/pi-tui': 0.84.1 @@ -2008,9 +2516,9 @@ snapshots: '@fallow-cli/win32-x64-msvc@3.17.0': optional: true - '@google/genai@1.52.0': + '@google/genai@1.52.0(supports-color@7.2.0)': dependencies: - google-auth-library: 10.9.1 + google-auth-library: 10.9.1(supports-color@7.2.0) p-retry: 4.6.2 protobufjs: 7.6.5 ws: 8.21.2 @@ -2019,9 +2527,9 @@ snapshots: - supports-color - utf-8-validate - '@gotgenes/pi-permission-system@25.4.0(@earendil-works/pi-coding-agent@0.84.1)(@earendil-works/pi-tui@0.84.1)': + '@gotgenes/pi-permission-system@25.4.0(@earendil-works/pi-coding-agent@0.84.1(supports-color@7.2.0))(@earendil-works/pi-tui@0.84.1)': dependencies: - '@earendil-works/pi-coding-agent': 0.84.1(ws@8.21.2)(zod@4.4.3) + '@earendil-works/pi-coding-agent': 0.84.1(supports-color@7.2.0)(ws@8.21.2)(zod@4.4.3) '@earendil-works/pi-tui': 0.84.1 tree-sitter-bash: 0.25.1 web-tree-sitter: 0.26.12 @@ -2029,8 +2537,46 @@ snapshots: transitivePeerDependencies: - tree-sitter + '@gotgenes/pi-permission-system@25.4.0(@earendil-works/pi-coding-agent@0.84.1)(@earendil-works/pi-tui@0.84.1)': + dependencies: + '@earendil-works/pi-coding-agent': 0.84.1 + '@earendil-works/pi-tui': 0.84.1 + tree-sitter-bash: 0.25.1 + web-tree-sitter: 0.26.12 + zod: 4.4.3 + transitivePeerDependencies: + - tree-sitter + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.6': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@mariozechner/clipboard-darwin-arm64@0.3.9': optional: true @@ -2094,6 +2640,9 @@ snapshots: '@opentelemetry/semantic-conventions@1.43.0': {} + '@pkgjs/parseargs@0.11.0': + optional: true + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -2319,6 +2868,41 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true + '@vitest/coverage-istanbul@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0))': + dependencies: + '@istanbuljs/schema': 0.1.6 + debug: 4.4.3(supports-color@7.2.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3(supports-color@7.2.0) + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6(supports-color@7.2.0) + istanbul-reports: 3.2.0 + magicast: 0.3.5 + test-exclude: 7.0.2 + tinyrainbow: 2.0.0 + vitest: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.12 + debug: 4.4.3(supports-color@7.2.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6(supports-color@7.2.0) + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + std-env: 3.10.0 + test-exclude: 7.0.2 + tinyrainbow: 2.0.0 + vitest: 3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + '@vitest/expect@3.2.7': dependencies: '@types/chai': 5.2.3 @@ -2363,24 +2947,58 @@ snapshots: agent-base@7.1.4: {} + ansi-regex@5.0.1: {} + + ansi-regex@6.3.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + assertion-error@2.0.1: {} + ast-v8-to-istanbul@0.3.12: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} base64-js@1.5.1: {} + baseline-browser-mapping@2.11.16: {} + bignumber.js@9.3.1: {} bowser@2.14.1: {} + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.16 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.411 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) + buffer-equal-constant-time@1.0.1: {} cac@6.7.14: {} + caniuse-lite@1.0.30001809: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -2393,6 +3011,14 @@ snapshots: check-error@2.1.3: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + convert-source-map@2.0.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2401,9 +3027,11 @@ snapshots: data-uri-to-buffer@4.0.1: {} - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 deep-eql@5.0.2: {} @@ -2411,10 +3039,18 @@ snapshots: diff@8.0.4: {} + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 + electron-to-chromium@1.5.411: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + es-module-lexer@1.7.0: {} esbuild@0.28.1: @@ -2446,6 +3082,8 @@ snapshots: '@esbuild/win32-ia32': 0.28.1 '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -2482,6 +3120,11 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -2489,36 +3132,47 @@ snapshots: fsevents@2.3.3: optional: true - gaxios@7.3.0: + gaxios@7.3.0(supports-color@7.2.0): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@7.2.0) node-fetch: 3.3.2 transitivePeerDependencies: - supports-color - gcp-metadata@8.1.2: + gcp-metadata@8.1.2(supports-color@7.2.0): dependencies: - gaxios: 7.3.0 + gaxios: 7.3.0(supports-color@7.2.0) google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: - supports-color + gensync@1.0.0-beta.2: {} + get-east-asian-width@1.6.0: {} + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@13.0.6: dependencies: minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 - google-auth-library@10.9.1: + google-auth-library@10.9.1(supports-color@7.2.0): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.3.0 - gcp-metadata: 8.1.2 + gaxios: 7.3.0(supports-color@7.2.0) + gcp-metadata: 8.1.2(supports-color@7.2.0) google-logging-utils: 1.1.3 jws: 4.0.1 transitivePeerDependencies: @@ -2530,34 +3184,83 @@ snapshots: grok-mermaid@0.2.2: {} + has-flag@4.0.0: {} + highlight.js@10.7.3: {} hosted-git-info@9.0.3: dependencies: lru-cache: 11.5.2 - http-proxy-agent@7.0.2: + html-escaper@2.0.2: {} + + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color ignore@7.0.5: {} + is-fullwidth-code-point@3.0.0: {} + isexe@2.0.0: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3(supports-color@7.2.0): + dependencies: + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/parser': 7.29.8 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-coverage: 3.2.2 + semver: 7.8.0 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6(supports-color@7.2.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@7.2.0) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jiti@2.7.0: {} + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + jsesc@3.1.0: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.3.1 @@ -2567,6 +3270,8 @@ snapshots: '@babel/runtime': 7.29.7 ts-algebra: 2.0.0 + json5@2.2.3: {} + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 @@ -2582,18 +3287,38 @@ snapshots: loupe@3.2.1: {} + lru-cache@10.4.3: {} + lru-cache@11.5.2: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.0 + marked@18.0.5: {} minimatch@10.2.5: dependencies: brace-expansion: 5.0.9 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + minipass@7.1.3: {} ms@2.1.3: {} @@ -2612,6 +3337,8 @@ snapshots: node-gyp-build@4.8.4: {} + node-releases@2.0.53: {} + openai@6.26.0(ws@8.21.2)(zod@4.4.3): optionalDependencies: ws: 8.21.2 @@ -2622,10 +3349,17 @@ snapshots: '@types/retry': 0.12.0 retry: 0.13.1 + package-json-from-dist@1.0.1: {} + partial-json@0.1.7: {} path-key@3.1.1: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -2703,6 +3437,8 @@ snapshots: safe-buffer@5.2.1: {} + semver@6.3.1: {} + semver@7.8.0: {} shebang-command@2.0.0: @@ -2715,16 +3451,48 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + source-map-js@1.2.1: {} stackback@0.0.2: {} std-env@3.10.0: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@7.0.2: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 10.5.0 + minimatch: 10.2.5 + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -2781,10 +3549,16 @@ snapshots: undici@8.9.0: {} - vite-node@3.2.4(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0): + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + + vite-node@3.2.4(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0): dependencies: cac: 6.7.14 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 7.3.6(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) @@ -2816,7 +3590,7 @@ snapshots: jiti: 2.7.0 yaml: 2.9.0 - vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0): + vitest@3.2.7(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 @@ -2827,7 +3601,7 @@ snapshots: '@vitest/spy': 3.2.7 '@vitest/utils': 3.2.7 chai: 5.3.3 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) expect-type: 1.4.0 magic-string: 0.30.21 pathe: 2.0.3 @@ -2839,7 +3613,7 @@ snapshots: tinypool: 1.1.1 tinyrainbow: 2.0.0 vite: 7.3.6(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) - vite-node: 3.2.4(@types/node@26.1.2)(jiti@2.7.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@26.1.2)(jiti@2.7.0)(supports-color@7.2.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.2 @@ -2870,8 +3644,22 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + ws@8.21.2: {} + yallist@3.1.1: {} + yaml@2.9.0: {} zod-to-json-schema@3.25.2(zod@4.4.3):