mirror of
https://github.com/SikongJueluo/pi-extensions.git
synced 2026-10-05 11:52:55 +08:00
refactor(ai-judge): group src modules into domain directories
- move evidence.ts and conversation.ts into evidence/ as bash.ts and conversation.ts - move prompt.ts and model.ts into judge/ - move highrisk.ts and judge.ts into authority/, renaming judge.ts to enforce.ts to avoid clashing with the judge/ directory - move review.ts and audit.ts into telemetry/ - move config.ts and catalog.ts into config/ as judge.ts and catalog.ts - rewrite static and dynamic imports across src, tools, and tests to the new paths - fix the models-catalog.json relative URL broken by the move (caught by fallow unresolved-import) - update the PIEXTENSIO-12 module map in the ADR to the new paths - add editorconfig for 4-space ts indentation
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
||||
import type { TelemetryHealth } from "./review";
|
||||
import type { TelemetryHealth } from "../telemetry/review";
|
||||
|
||||
/**
|
||||
* Enforce truth table (PIEXTENSIO-3 cat.4 / M5; ADR 0008 / PIEXTENSIO-23).
|
||||
+1
-1
@@ -267,5 +267,5 @@ export function classifyModel(
|
||||
|
||||
/** Package-root catalog path (data, not source; beside reports/). */
|
||||
export const DEFAULT_CATALOG_PATH: string = fileURLToPath(
|
||||
new URL("../models-catalog.json", import.meta.url),
|
||||
new URL("../../models-catalog.json", import.meta.url),
|
||||
);
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS, MIN_TIMEOUT_MS } from "./model";
|
||||
import { DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS, MIN_TIMEOUT_MS } from "../judge/model";
|
||||
|
||||
/**
|
||||
* Judge configuration (PIEXTENSIO-3 Config acceptance, PIEXTENSIO-11
|
||||
@@ -11,31 +11,31 @@ import {
|
||||
type AuthorizerLog,
|
||||
type AuthorizerVerdict,
|
||||
} from "@gotgenes/pi-permission-system";
|
||||
import { buildBashJudgmentEvidence, type BashJudgmentEvidence } from "./evidence";
|
||||
import { buildBashJudgmentEvidence, type BashJudgmentEvidence } from "./evidence/bash";
|
||||
import {
|
||||
createModelAvailability,
|
||||
requestStructuredVerdict,
|
||||
type ModelAvailability,
|
||||
type ModelAttempt,
|
||||
} from "./model";
|
||||
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "./prompt";
|
||||
import { loadJudgeConfig, type EffectiveJudgeConfig } from "./config";
|
||||
import { createReviewSink, type ReviewSink } from "./review";
|
||||
import { createAuditLog, type AuditLog } from "./audit";
|
||||
} from "./judge/model";
|
||||
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "./judge/prompt";
|
||||
import { loadJudgeConfig, type EffectiveJudgeConfig } from "./config/judge";
|
||||
import { createReviewSink, type ReviewSink } from "./telemetry/review";
|
||||
import { createAuditLog, type AuditLog } from "./telemetry/audit";
|
||||
import {
|
||||
buildConversationEvidence,
|
||||
conversationProbeFromSession,
|
||||
type ConversationEvidence,
|
||||
} from "./conversation";
|
||||
import { classifyHighRisk, type HighRiskMatch } from "./highrisk";
|
||||
import { evaluateEnforceAuthority, type EnforceGateState } from "./judge";
|
||||
} from "./evidence/conversation";
|
||||
import { classifyHighRisk, type HighRiskMatch } from "./authority/highrisk";
|
||||
import { evaluateEnforceAuthority, type EnforceGateState } from "./authority/enforce";
|
||||
import {
|
||||
classifyModel,
|
||||
loadModelCatalog,
|
||||
DEFAULT_CATALOG_PATH,
|
||||
type ModelCatalogClassification,
|
||||
type LoadedModelCatalog,
|
||||
} from "./catalog";
|
||||
} from "./config/catalog";
|
||||
|
||||
const LINK_NAME = "ai-bash-judge";
|
||||
const REVIEW_SCHEMA_VERSION = 1;
|
||||
|
||||
+2
-2
@@ -5,8 +5,8 @@ import type {
|
||||
} from "@earendil-works/pi-ai";
|
||||
import type { ModelRegistry } from "@earendil-works/pi-coding-agent";
|
||||
import { buildJudgeContext, MAX_REASON_CODE_POINTS, REPORT_VERDICT_TOOL_NAME } from "./prompt";
|
||||
import type { BashJudgmentEvidence } from "./evidence";
|
||||
import type { ConversationEvidence } from "./conversation";
|
||||
import type { BashJudgmentEvidence } from "../evidence/bash";
|
||||
import type { ConversationEvidence } from "../evidence/conversation";
|
||||
|
||||
// 15s is the PIEXTENSIO-11 calibrated default (canonical resolution c0b0028d):
|
||||
// 15,000 ms total wall-clock deadline, accepted config range 5,000–30,000 ms,
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
import { Type, type AssistantMessage, type Context, type Tool, type UserMessage } from "@earendil-works/pi-ai";
|
||||
import type { BashJudgmentEvidence } from "./evidence";
|
||||
import type { ConversationEvidence } from "./conversation";
|
||||
import type { BashJudgmentEvidence } from "../evidence/bash";
|
||||
import type { ConversationEvidence } from "../evidence/conversation";
|
||||
|
||||
export const PROMPT_VERSION = "bash-shadow-v4";
|
||||
export const TOOL_SCHEMA_VERSION = "report-verdict-v1";
|
||||
@@ -2,7 +2,7 @@ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join } from "node:path";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { createAuditLog } from "../src/audit";
|
||||
import { createAuditLog } from "../src/telemetry/audit";
|
||||
|
||||
const dirs: string[] = [];
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
classifyModel,
|
||||
loadModelCatalog,
|
||||
type CatalogDeps,
|
||||
} from "../src/catalog";
|
||||
} from "../src/config/catalog";
|
||||
|
||||
/**
|
||||
* PIEXTENSIO-24: the advisory model catalog shipped with the package.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { loadJudgeConfig, type ConfigLoadDeps } from "../src/config";
|
||||
import { loadJudgeConfig, type ConfigLoadDeps } from "../src/config/judge";
|
||||
|
||||
function deps(files: Record<string, string> = {}): ConfigLoadDeps {
|
||||
return {
|
||||
|
||||
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildConversationEvidence,
|
||||
type ConversationProbe,
|
||||
} from "../src/conversation";
|
||||
} from "../src/evidence/conversation";
|
||||
|
||||
function entry(text: string): unknown {
|
||||
return {
|
||||
|
||||
@@ -5,8 +5,8 @@ import {
|
||||
DEFAULT_TIMEOUT_MS,
|
||||
MIN_TIMEOUT_MS,
|
||||
MAX_TIMEOUT_MS,
|
||||
} from "../src/model";
|
||||
import { createModelAvailability } from "../src/model";
|
||||
} from "../src/judge/model";
|
||||
import { createModelAvailability } from "../src/judge/model";
|
||||
import {
|
||||
applyTimeoutOption,
|
||||
replayCorpus,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import type { PromptPermissionDetails } from "@gotgenes/pi-permission-system";
|
||||
import { buildBashJudgmentEvidence } from "../src/evidence";
|
||||
import { buildBashJudgmentEvidence } from "../src/evidence/bash";
|
||||
|
||||
function details(
|
||||
unit: string,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { classifyHighRisk } from "../src/highrisk";
|
||||
import { classifyHighRisk } from "../src/authority/highrisk";
|
||||
|
||||
describe("classifyHighRisk — data_loss", () => {
|
||||
it.each([
|
||||
|
||||
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
evaluateEnforceAuthority,
|
||||
type EnforceGateState,
|
||||
} from "../src/judge";
|
||||
} from "../src/authority/enforce";
|
||||
|
||||
const ALL_OPEN: EnforceGateState = {
|
||||
auditHealthy: true,
|
||||
|
||||
@@ -41,8 +41,8 @@ const { mockCatalog } = vi.hoisted(() => ({
|
||||
diagnostics: [] as Array<Record<string, unknown>>,
|
||||
},
|
||||
}));
|
||||
vi.mock("../src/catalog", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../src/catalog")>();
|
||||
vi.mock("../src/config/catalog", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../src/config/catalog")>();
|
||||
return {
|
||||
...actual,
|
||||
loadModelCatalog: () => ({
|
||||
@@ -69,8 +69,8 @@ import {
|
||||
unpublishPermissionsService,
|
||||
} from "@gotgenes/pi-permission-system";
|
||||
import extension from "../src/index";
|
||||
import type { ModelCatalogEntry } from "../src/catalog";
|
||||
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "../src/prompt";
|
||||
import type { ModelCatalogEntry } from "../src/config/catalog";
|
||||
import { PROMPT_VERSION, TOOL_SCHEMA_VERSION } from "../src/judge/prompt";
|
||||
|
||||
function createFakePi(): {
|
||||
pi: ExtensionAPI;
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
createModelAvailability,
|
||||
requestStructuredVerdict,
|
||||
type ModelAvailability,
|
||||
} from "../src/model";
|
||||
} from "../src/judge/model";
|
||||
|
||||
const metadata = {
|
||||
provider: "test-provider",
|
||||
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
MAX_REASON_CODE_POINTS,
|
||||
PROMPT_VERSION,
|
||||
REPORT_VERDICT_TOOL_NAME,
|
||||
} from "../src/prompt";
|
||||
} from "../src/judge/prompt";
|
||||
import type { Context } from "@earendil-works/pi-ai";
|
||||
|
||||
describe("buildJudgeContext", () => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { createReviewSink, type ReviewSinkDeps } from "../src/review";
|
||||
import { createReviewSink, type ReviewSinkDeps } from "../src/telemetry/review";
|
||||
import type { AuthorizerLog } from "@gotgenes/pi-permission-system";
|
||||
|
||||
function fakeLog(): AuthorizerLog & {
|
||||
|
||||
@@ -29,9 +29,9 @@ import {
|
||||
MIN_TIMEOUT_MS,
|
||||
MAX_TIMEOUT_MS,
|
||||
type ModelAvailability,
|
||||
} from "../src/model";
|
||||
import type { BashJudgmentEvidence } from "../src/evidence";
|
||||
import type { ConversationEvidence } from "../src/conversation";
|
||||
} from "../src/judge/model";
|
||||
import type { BashJudgmentEvidence } from "../src/evidence/bash";
|
||||
import type { ConversationEvidence } from "../src/evidence/conversation";
|
||||
|
||||
interface CorpusCase {
|
||||
readonly id: string;
|
||||
@@ -491,7 +491,7 @@ async function resolveReplayModel(
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
const { createModelAvailability } = await import("../src/model");
|
||||
const { createModelAvailability } = await import("../src/judge/model");
|
||||
const availability: ModelAvailability = createModelAvailability(found, registry);
|
||||
if (availability.kind !== "ready") {
|
||||
process.stderr.write(
|
||||
@@ -599,7 +599,7 @@ async function main(): Promise<number> {
|
||||
asOf: new Date().toISOString(),
|
||||
provider: parsed.provider,
|
||||
model: parsed.model,
|
||||
promptVersion: (await import("../src/prompt")).PROMPT_VERSION,
|
||||
promptVersion: (await import("../src/judge/prompt")).PROMPT_VERSION,
|
||||
corpusVersion: CORPUS_VERSION,
|
||||
timeoutMs: parsed.timeoutMs,
|
||||
strict: parsed.strict,
|
||||
|
||||
Reference in New Issue
Block a user