@adversarylabs/sdk 0.1.33 → 0.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -21
- package/README.md +61 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +2 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -1
- package/dist/outcome-context.d.ts +2 -1
- package/dist/outcome-context.d.ts.map +1 -1
- package/dist/outcome-context.js +37 -6
- package/dist/outcome-context.js.map +1 -1
- package/dist/repository-model.d.ts +7 -1
- package/dist/repository-model.d.ts.map +1 -1
- package/dist/repository-model.js +209 -12
- package/dist/repository-model.js.map +1 -1
- package/dist/sources.d.ts.map +1 -1
- package/dist/sources.js +0 -1
- package/dist/sources.js.map +1 -1
- package/package.json +2 -2
- package/schemas/adversary.outcome-context.v1.schema.json +64 -10
package/dist/model.d.ts
CHANGED
|
@@ -76,9 +76,11 @@ export declare class ModelUnavailableError extends Error {
|
|
|
76
76
|
export declare class ModelReviewError extends Error {
|
|
77
77
|
readonly code?: string;
|
|
78
78
|
readonly retryable: boolean;
|
|
79
|
+
readonly diagnostics?: Readonly<Record<string, unknown>>;
|
|
79
80
|
constructor(message: string, options?: {
|
|
80
81
|
code?: string;
|
|
81
82
|
retryable?: boolean;
|
|
83
|
+
diagnostics?: Readonly<Record<string, unknown>>;
|
|
82
84
|
});
|
|
83
85
|
}
|
|
84
86
|
export declare function createModelFromEnvironment(environment?: ModelEnvironment): ReviewModel;
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAiBjE,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,OAAO;IAChD,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,0BAA0B,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC/C,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,sEAAsE;AACtE,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG;IAChD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AA0B5E,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,SAA8D;CAIlF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/model.js
CHANGED
|
@@ -25,10 +25,12 @@ export class ModelUnavailableError extends Error {
|
|
|
25
25
|
export class ModelReviewError extends Error {
|
|
26
26
|
code;
|
|
27
27
|
retryable;
|
|
28
|
+
diagnostics;
|
|
28
29
|
constructor(message, options = {}) {
|
|
29
30
|
super(message);
|
|
30
31
|
this.name = "ModelReviewError";
|
|
31
32
|
this.code = options.code;
|
|
33
|
+
this.diagnostics = options.diagnostics;
|
|
32
34
|
this.retryable = options.retryable ?? false;
|
|
33
35
|
}
|
|
34
36
|
}
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type {\n ModelRepositoryCitation,\n ModelRepositoryRetrieval,\n ModelRepositoryToolOptions,\n} from \"./repository-model.js\";\n\nexport const ADVERSARY_MODEL_PROTOCOL_VERSION = 1;\nexport const ADVERSARY_MODEL_ENDPOINT_ENV = \"ADVERSARY_MODEL_ENDPOINT\";\nexport const ADVERSARY_MODEL_TOKEN_ENV = \"ADVERSARY_MODEL_TOKEN\";\n\nconst DEFAULT_MODEL_TIMEOUT_MS = 120_000;\nconst MAX_MODEL_TIMEOUT_MS = 600_000;\nconst DEFAULT_MAXIMUM_OUTPUT_TOKENS = 8_192;\nconst MAX_MAXIMUM_OUTPUT_TOKENS = 65_536;\nconst MAX_PROMPT_BYTES = 256 << 10;\nconst MAX_INPUT_BYTES = 4 << 20;\nconst MAX_SCHEMA_BYTES = 512 << 10;\nconst MAX_RESPONSE_BYTES = 4 << 20;\nconst DEFAULT_BROKER_MAXIMUM_ATTEMPTS = 3;\nconst DEFAULT_BROKER_RETRY_DELAY_MS = 250;\nconst MAX_BROKER_RETRY_DELAY_MS = 5_000;\nconst DEFAULT_VALIDATION_MAXIMUM_ATTEMPTS = 3;\nconst MAX_VALIDATION_MAXIMUM_ATTEMPTS = 5;\nconst MAX_VALIDATION_FEEDBACK_BYTES = 8 << 10;\n\nexport interface ModelReviewBudget {\n maximumOutputTokens?: number;\n timeoutMs?: number;\n}\n\nexport interface ModelReviewValidation<T = unknown> {\n /** Validate a completed model result. Throw to retry generation with the error as feedback. */\n validate(result: ModelReviewResult<T>): void | Promise<void>;\n /** Total generation attempts, including the first. Defaults to 3 and is capped at 5. */\n maximumAttempts?: number;\n}\n\nexport interface ModelReviewRequest<T = unknown> {\n prompt: string;\n input: unknown;\n schema: Record<string, unknown>;\n budget?: ModelReviewBudget;\n validation?: ModelReviewValidation<T>;\n tools?: {\n repository: ModelRepositoryToolOptions;\n };\n}\n\nexport interface ModelReviewUsage {\n inputTokens?: number;\n outputTokens?: number;\n}\n\nexport interface ModelReviewResult<T = unknown> {\n output: T;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n citations?: readonly ModelRepositoryCitation[];\n retrieval?: ModelRepositoryRetrieval;\n}\n\nexport interface ReviewModel {\n review<T = unknown>(request: ModelReviewRequest<T>): Promise<ModelReviewResult<T>>;\n}\n\nexport interface BrokerReviewModelOptions {\n maximumAttempts?: number;\n initialRetryDelayMs?: number;\n random?: () => number;\n}\n\n/**\n * Request a short noun-phrase concern suitable after \"I would address …\".\n * Implemented by the SDK via {@link ReviewModel.review} (CLI broker pass-through).\n */\nexport interface ModelConcernRequest {\n /** Free-form title, clause, or draft concern to rewrite. */\n text: string;\n budget?: ModelReviewBudget;\n /**\n * Extra attempts when the model returns a phrase that fails noun-phrase validation.\n * Defaults to 1 retry (2 total attempts).\n */\n maxAttempts?: number;\n}\n\nexport interface ModelConcernResult {\n /** Validated noun phrase (see requireOpinionConcern). */\n concern: string;\n /** False when `text` was already a valid noun phrase (no broker call). */\n rewritten: boolean;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n}\n\n/** Rule-context model: broker review plus opinion-concern rewrite. */\nexport type ContextualReviewModel = ReviewModel & {\n concern(request: ModelConcernRequest): Promise<ModelConcernResult>;\n};\n\nexport type ModelEnvironment = Readonly<Record<string, string | undefined>>;\n\ninterface ModelBrokerRequest extends Omit<ModelReviewRequest, \"validation\" | \"tools\"> {\n protocolVersion: typeof ADVERSARY_MODEL_PROTOCOL_VERSION;\n}\n\ninterface ModelBrokerResponse {\n protocolVersion: typeof ADVERSARY_MODEL_PROTOCOL_VERSION;\n output: unknown;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n}\n\ninterface ModelBrokerErrorResponse {\n error?: {\n code?: string;\n message?: string;\n retryable?: boolean;\n };\n}\n\ntype NormalizedModelReviewRequest = Omit<ModelReviewRequest, \"budget\" | \"validation\" | \"tools\"> & {\n budget: Required<ModelReviewBudget>;\n};\n\nexport class ModelUnavailableError extends Error {\n constructor(message = \"Model review is unavailable for this adversary execution.\") {\n super(message);\n this.name = \"ModelUnavailableError\";\n }\n}\n\nexport class ModelReviewError extends Error {\n readonly code?: string;\n readonly retryable: boolean;\n\n constructor(message: string, options: { code?: string; retryable?: boolean } = {}) {\n super(message);\n this.name = \"ModelReviewError\";\n this.code = options.code;\n this.retryable = options.retryable ?? false;\n }\n}\n\nexport function createModelFromEnvironment(\n environment: ModelEnvironment = process.env,\n): ReviewModel {\n const endpoint = environment[ADVERSARY_MODEL_ENDPOINT_ENV]?.trim();\n const token = environment[ADVERSARY_MODEL_TOKEN_ENV]?.trim();\n if (endpoint === undefined || endpoint === \"\" || token === undefined || token === \"\") {\n return unavailableModel();\n }\n return new BrokerReviewModel(endpoint, token);\n}\n\nexport function unavailableModel(): ReviewModel {\n return Object.freeze({\n async review(): Promise<never> {\n throw new ModelUnavailableError();\n },\n });\n}\n\nexport class BrokerReviewModel implements ReviewModel {\n readonly endpoint: string;\n readonly #token: string;\n readonly #maximumAttempts: number;\n readonly #initialRetryDelayMs: number;\n readonly #random: () => number;\n\n constructor(endpoint: string, token: string, options: BrokerReviewModelOptions = {}) {\n const parsed = new URL(endpoint);\n if (\n parsed.protocol !== \"http:\" ||\n (parsed.hostname !== \"127.0.0.1\" &&\n parsed.hostname !== \"::1\" &&\n parsed.hostname !== \"[::1]\" &&\n parsed.hostname !== \"localhost\")\n ) {\n throw new ModelReviewError(\n \"The model broker endpoint must use HTTP on the local loopback interface.\",\n { code: \"invalid_broker_endpoint\" },\n );\n }\n if (token.trim() === \"\") {\n throw new ModelReviewError(\"The model broker token must not be empty.\", {\n code: \"invalid_broker_token\",\n });\n }\n this.endpoint = parsed.toString();\n this.#token = token;\n const maximumAttempts = options.maximumAttempts ?? DEFAULT_BROKER_MAXIMUM_ATTEMPTS;\n const initialRetryDelayMs = options.initialRetryDelayMs ?? DEFAULT_BROKER_RETRY_DELAY_MS;\n requireIntegerRange(maximumAttempts, \"maximumAttempts\", 1, 5);\n requireIntegerRange(initialRetryDelayMs, \"initialRetryDelayMs\", 0, MAX_BROKER_RETRY_DELAY_MS);\n this.#maximumAttempts = maximumAttempts;\n this.#initialRetryDelayMs = initialRetryDelayMs;\n this.#random = options.random ?? Math.random;\n }\n\n async review<T = unknown>(request: ModelReviewRequest<T>): Promise<ModelReviewResult<T>> {\n if (request.tools?.repository !== undefined) {\n throw new ModelReviewError(\n \"Repository model tools require ctx.model so the SDK can enforce the repository boundary.\",\n { code: \"invalid_model_request\" },\n );\n }\n const normalized = normalizeRequest(request);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), normalized.budget.timeoutMs);\n try {\n for (let attempt = 1; attempt <= this.#maximumAttempts; attempt += 1) {\n try {\n return await this.#reviewOnce<T>(normalized, controller.signal);\n } catch (error) {\n if (\n !(error instanceof ModelReviewError) ||\n !error.retryable ||\n controller.signal.aborted ||\n attempt === this.#maximumAttempts\n ) {\n throw error;\n }\n const exponential = Math.min(\n MAX_BROKER_RETRY_DELAY_MS,\n this.#initialRetryDelayMs * 2 ** (attempt - 1),\n );\n const jittered = Math.round(exponential * (0.75 + 0.5 * this.#random()));\n await waitForRetry(jittered, controller.signal, normalized.budget.timeoutMs);\n }\n }\n throw new ModelReviewError(\"Model broker retry loop exhausted unexpectedly.\", {\n code: \"broker_unavailable\",\n retryable: true,\n });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n async #reviewOnce<T>(\n normalized: NormalizedModelReviewRequest,\n signal: AbortSignal,\n ): Promise<ModelReviewResult<T>> {\n let response: Response;\n try {\n response = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${this.#token}`,\n \"content-type\": \"application/json\",\n \"x-adversary-model-protocol\": String(ADVERSARY_MODEL_PROTOCOL_VERSION),\n },\n body: JSON.stringify({\n protocolVersion: ADVERSARY_MODEL_PROTOCOL_VERSION,\n prompt: normalized.prompt,\n input: normalized.input,\n schema: normalized.schema,\n budget: normalized.budget,\n } satisfies ModelBrokerRequest),\n signal,\n });\n } catch (error) {\n if (signal.aborted) {\n throw modelTimeoutError(normalized.budget.timeoutMs);\n }\n throw new ModelReviewError(\n `Model broker request failed: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"broker_unavailable\", retryable: true },\n );\n }\n\n let body: string;\n try {\n body = await readBoundedResponse(response);\n } catch (error) {\n if (signal.aborted) {\n throw modelTimeoutError(normalized.budget.timeoutMs);\n }\n throw error;\n }\n let decoded: unknown;\n try {\n decoded = JSON.parse(body);\n } catch {\n throw new ModelReviewError(\"Model broker returned malformed JSON.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (!response.ok) {\n const failure = decoded as ModelBrokerErrorResponse;\n throw new ModelReviewError(\n failure.error?.message ?? `Model broker returned HTTP ${response.status}.`,\n {\n code: failure.error?.code ?? \"model_review_failed\",\n retryable: failure.error?.retryable ?? response.status >= 500,\n },\n );\n }\n\n const envelope = requireBrokerResponse(decoded);\n validateModelOutput(normalized.schema, envelope.output);\n return {\n output: envelope.output as T,\n provider: envelope.provider,\n model: envelope.model,\n ...(envelope.usage === undefined ? {} : { usage: envelope.usage }),\n };\n }\n}\n\n/**\n * Run adversary-owned semantic validation with SDK-owned bounded regeneration.\n *\n * Each retry receives the validator failure as trusted SDK feedback while retaining the\n * original input. The original timeout is shared by all validation attempts, and usage is\n * aggregated across them. Repository callers may decorate the raw result with citations before\n * validation without repeating repository retrieval.\n */\nexport async function reviewWithValidation<T>(\n model: ReviewModel,\n request: ModelReviewRequest<T>,\n decorate: (result: ModelReviewResult<T>) => ModelReviewResult<T> = (result) => result,\n): Promise<ModelReviewResult<T>> {\n const validation = request.validation;\n const { validation: _validation, tools: _tools, ...baseRequest } = request;\n if (validation === undefined) return decorate(await model.review<T>(baseRequest));\n\n const maximumAttempts = validation.maximumAttempts ?? DEFAULT_VALIDATION_MAXIMUM_ATTEMPTS;\n requireIntegerRange(\n maximumAttempts,\n \"validation.maximumAttempts\",\n 1,\n MAX_VALIDATION_MAXIMUM_ATTEMPTS,\n );\n const timeoutMs = request.budget?.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n const startedAt = Date.now();\n let usage: ModelReviewUsage = {};\n let feedback: string | undefined;\n\n for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {\n const elapsed = Date.now() - startedAt;\n const remainingTimeoutMs = timeoutMs - elapsed;\n if (remainingTimeoutMs <= 0) throw modelTimeoutError(timeoutMs);\n const result = decorate(\n await model.review<T>({\n ...baseRequest,\n prompt:\n feedback === undefined\n ? baseRequest.prompt\n : `${baseRequest.prompt}\\n\\nSDK VALIDATION FEEDBACK:\\nThe previous response failed adversary-defined validation. Correct the response using this trusted validation result and return the complete response again.\\n${JSON.stringify({ attempt, error: feedback })}`,\n budget: {\n ...baseRequest.budget,\n timeoutMs: remainingTimeoutMs,\n },\n }),\n );\n usage = addModelUsage(usage, result.usage);\n try {\n await validation.validate(result);\n return {\n ...result,\n ...(usage.inputTokens === undefined && usage.outputTokens === undefined ? {} : { usage }),\n };\n } catch (error) {\n feedback = boundedValidationFeedback(error);\n if (attempt === maximumAttempts) {\n throw new ModelReviewError(\n `Model output failed adversary validation after ${maximumAttempts} attempts: ${feedback}`,\n { code: \"model_validation_failed\", retryable: false },\n );\n }\n }\n }\n throw new ModelReviewError(\"Model validation retry loop exhausted unexpectedly.\", {\n code: \"model_validation_failed\",\n retryable: false,\n });\n}\n\nfunction boundedValidationFeedback(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n const encoded = Buffer.from(message, \"utf8\");\n return encoded.byteLength <= MAX_VALIDATION_FEEDBACK_BYTES\n ? message\n : `${encoded.subarray(0, MAX_VALIDATION_FEEDBACK_BYTES).toString(\"utf8\")}…`;\n}\n\nfunction addModelUsage(\n total: ModelReviewUsage,\n next: ModelReviewUsage | undefined,\n): ModelReviewUsage {\n if (next === undefined) return total;\n return {\n ...(total.inputTokens === undefined && next.inputTokens === undefined\n ? {}\n : { inputTokens: (total.inputTokens ?? 0) + (next.inputTokens ?? 0) }),\n ...(total.outputTokens === undefined && next.outputTokens === undefined\n ? {}\n : { outputTokens: (total.outputTokens ?? 0) + (next.outputTokens ?? 0) }),\n };\n}\n\nasync function waitForRetry(\n delayMs: number,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<void> {\n if (signal.aborted) {\n throw modelTimeoutError(timeoutMs);\n }\n await new Promise<void>((resolve, reject) => {\n const onAbort = () => {\n clearTimeout(timer);\n reject(modelTimeoutError(timeoutMs));\n };\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction modelTimeoutError(timeoutMs: number): ModelReviewError {\n return new ModelReviewError(`Model review exceeded its ${timeoutMs}ms timeout.`, {\n code: \"model_timeout\",\n retryable: true,\n });\n}\n\nfunction normalizeRequest(request: ModelReviewRequest): NormalizedModelReviewRequest {\n if (typeof request !== \"object\" || request === null) {\n throw new ModelReviewError(\"Model review request must be an object.\", {\n code: \"invalid_model_request\",\n });\n }\n if (typeof request.prompt !== \"string\" || request.prompt.trim() === \"\") {\n throw new ModelReviewError(\"Model review prompt must be a non-empty string.\", {\n code: \"invalid_model_request\",\n });\n }\n const promptBytes = Buffer.byteLength(request.prompt, \"utf8\");\n if (promptBytes > MAX_PROMPT_BYTES) {\n throw new ModelReviewError(`Model review prompt exceeds ${MAX_PROMPT_BYTES} bytes.`, {\n code: \"model_request_too_large\",\n });\n }\n requireJsonSize(request.input, \"input\", MAX_INPUT_BYTES);\n if (\n typeof request.schema !== \"object\" ||\n request.schema === null ||\n Array.isArray(request.schema)\n ) {\n throw new ModelReviewError(\"Model review schema must be a JSON Schema object.\", {\n code: \"invalid_model_schema\",\n });\n }\n requireJsonSize(request.schema, \"schema\", MAX_SCHEMA_BYTES);\n\n const maximumOutputTokens = request.budget?.maximumOutputTokens ?? DEFAULT_MAXIMUM_OUTPUT_TOKENS;\n const timeoutMs = request.budget?.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n requireIntegerRange(\n maximumOutputTokens,\n \"budget.maximumOutputTokens\",\n 1,\n MAX_MAXIMUM_OUTPUT_TOKENS,\n );\n requireIntegerRange(timeoutMs, \"budget.timeoutMs\", 1, MAX_MODEL_TIMEOUT_MS);\n return {\n prompt: request.prompt,\n input: request.input,\n schema: request.schema,\n budget: { maximumOutputTokens, timeoutMs },\n };\n}\n\nfunction requireJsonSize(value: unknown, name: string, maximum: number): void {\n let encoded: string | undefined;\n try {\n encoded = JSON.stringify(value);\n } catch (error) {\n throw new ModelReviewError(\n `Model review ${name} must be JSON-serializable: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"invalid_model_request\" },\n );\n }\n if (encoded === undefined) {\n throw new ModelReviewError(`Model review ${name} must be JSON-serializable.`, {\n code: \"invalid_model_request\",\n });\n }\n if (Buffer.byteLength(encoded, \"utf8\") > maximum) {\n throw new ModelReviewError(`Model review ${name} exceeds ${maximum} bytes.`, {\n code: \"model_request_too_large\",\n });\n }\n}\n\nfunction requireIntegerRange(value: number, name: string, minimum: number, maximum: number): void {\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\n throw new ModelReviewError(`${name} must be an integer from ${minimum} through ${maximum}.`, {\n code: \"invalid_model_budget\",\n });\n }\n}\n\nasync function readBoundedResponse(response: Response): Promise<string> {\n const declared = response.headers.get(\"content-length\");\n if (declared !== null && Number(declared) > MAX_RESPONSE_BYTES) {\n throw new ModelReviewError(`Model broker response exceeds ${MAX_RESPONSE_BYTES} bytes.`, {\n code: \"model_response_too_large\",\n });\n }\n if (response.body === null) {\n return \"\";\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n size += value.byteLength;\n if (size > MAX_RESPONSE_BYTES) {\n await reader.cancel();\n throw new ModelReviewError(`Model broker response exceeds ${MAX_RESPONSE_BYTES} bytes.`, {\n code: \"model_response_too_large\",\n });\n }\n chunks.push(value);\n }\n const joined = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n joined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(joined);\n}\n\nfunction requireBrokerResponse(value: unknown): ModelBrokerResponse {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new ModelReviewError(\"Model broker response must be an object.\", {\n code: \"invalid_broker_response\",\n });\n }\n const response = value as Partial<ModelBrokerResponse>;\n if (response.protocolVersion !== ADVERSARY_MODEL_PROTOCOL_VERSION) {\n throw new ModelReviewError(\n `Model broker protocol version must be ${ADVERSARY_MODEL_PROTOCOL_VERSION}.`,\n { code: \"unsupported_model_protocol\" },\n );\n }\n if (typeof response.provider !== \"string\" || response.provider.trim() === \"\") {\n throw new ModelReviewError(\"Model broker response provider must be a non-empty string.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (typeof response.model !== \"string\" || response.model.trim() === \"\") {\n throw new ModelReviewError(\"Model broker response model must be a non-empty string.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (!Object.hasOwn(response, \"output\")) {\n throw new ModelReviewError(\"Model broker response is missing output.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (response.usage !== undefined) {\n validateUsage(response.usage);\n }\n return response as ModelBrokerResponse;\n}\n\nfunction validateUsage(value: unknown): asserts value is ModelReviewUsage {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new ModelReviewError(\"Model broker response usage must be an object.\", {\n code: \"invalid_broker_response\",\n });\n }\n for (const field of [\"inputTokens\", \"outputTokens\"] as const) {\n const count = (value as ModelReviewUsage)[field];\n if (count !== undefined && (!Number.isInteger(count) || count < 0)) {\n throw new ModelReviewError(\n `Model broker response usage.${field} must be a non-negative integer.`,\n {\n code: \"invalid_broker_response\",\n },\n );\n }\n }\n}\n\nfunction validateModelOutput(schema: Record<string, unknown>, output: unknown): void {\n const ajv = new Ajv2020({ allErrors: true, strict: true });\n let validate: ReturnType<Ajv2020[\"compile\"]>;\n try {\n validate = ajv.compile(schema);\n } catch (error) {\n throw new ModelReviewError(\n `Model review schema is invalid: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"invalid_model_schema\" },\n );\n }\n if (!validate(output)) {\n const detail = ajv.errorsText(validate.errors, { separator: \"; \" });\n throw new ModelReviewError(`Model output does not match the requested schema: ${detail}`, {\n code: \"invalid_model_output\",\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Ajv2020 } from \"ajv/dist/2020.js\";\nimport type {\n ModelRepositoryCitation,\n ModelRepositoryRetrieval,\n ModelRepositoryToolOptions,\n} from \"./repository-model.js\";\n\nexport const ADVERSARY_MODEL_PROTOCOL_VERSION = 1;\nexport const ADVERSARY_MODEL_ENDPOINT_ENV = \"ADVERSARY_MODEL_ENDPOINT\";\nexport const ADVERSARY_MODEL_TOKEN_ENV = \"ADVERSARY_MODEL_TOKEN\";\n\nconst DEFAULT_MODEL_TIMEOUT_MS = 120_000;\nconst MAX_MODEL_TIMEOUT_MS = 600_000;\nconst DEFAULT_MAXIMUM_OUTPUT_TOKENS = 8_192;\nconst MAX_MAXIMUM_OUTPUT_TOKENS = 65_536;\nconst MAX_PROMPT_BYTES = 256 << 10;\nconst MAX_INPUT_BYTES = 4 << 20;\nconst MAX_SCHEMA_BYTES = 512 << 10;\nconst MAX_RESPONSE_BYTES = 4 << 20;\nconst DEFAULT_BROKER_MAXIMUM_ATTEMPTS = 3;\nconst DEFAULT_BROKER_RETRY_DELAY_MS = 250;\nconst MAX_BROKER_RETRY_DELAY_MS = 5_000;\nconst DEFAULT_VALIDATION_MAXIMUM_ATTEMPTS = 3;\nconst MAX_VALIDATION_MAXIMUM_ATTEMPTS = 5;\nconst MAX_VALIDATION_FEEDBACK_BYTES = 8 << 10;\n\nexport interface ModelReviewBudget {\n maximumOutputTokens?: number;\n timeoutMs?: number;\n}\n\nexport interface ModelReviewValidation<T = unknown> {\n /** Validate a completed model result. Throw to retry generation with the error as feedback. */\n validate(result: ModelReviewResult<T>): void | Promise<void>;\n /** Total generation attempts, including the first. Defaults to 3 and is capped at 5. */\n maximumAttempts?: number;\n}\n\nexport interface ModelReviewRequest<T = unknown> {\n prompt: string;\n input: unknown;\n schema: Record<string, unknown>;\n budget?: ModelReviewBudget;\n validation?: ModelReviewValidation<T>;\n tools?: {\n repository: ModelRepositoryToolOptions;\n };\n}\n\nexport interface ModelReviewUsage {\n inputTokens?: number;\n outputTokens?: number;\n}\n\nexport interface ModelReviewResult<T = unknown> {\n output: T;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n citations?: readonly ModelRepositoryCitation[];\n retrieval?: ModelRepositoryRetrieval;\n}\n\nexport interface ReviewModel {\n review<T = unknown>(request: ModelReviewRequest<T>): Promise<ModelReviewResult<T>>;\n}\n\nexport interface BrokerReviewModelOptions {\n maximumAttempts?: number;\n initialRetryDelayMs?: number;\n random?: () => number;\n}\n\n/**\n * Request a short noun-phrase concern suitable after \"I would address …\".\n * Implemented by the SDK via {@link ReviewModel.review} (CLI broker pass-through).\n */\nexport interface ModelConcernRequest {\n /** Free-form title, clause, or draft concern to rewrite. */\n text: string;\n budget?: ModelReviewBudget;\n /**\n * Extra attempts when the model returns a phrase that fails noun-phrase validation.\n * Defaults to 1 retry (2 total attempts).\n */\n maxAttempts?: number;\n}\n\nexport interface ModelConcernResult {\n /** Validated noun phrase (see requireOpinionConcern). */\n concern: string;\n /** False when `text` was already a valid noun phrase (no broker call). */\n rewritten: boolean;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n}\n\n/** Rule-context model: broker review plus opinion-concern rewrite. */\nexport type ContextualReviewModel = ReviewModel & {\n concern(request: ModelConcernRequest): Promise<ModelConcernResult>;\n};\n\nexport type ModelEnvironment = Readonly<Record<string, string | undefined>>;\n\ninterface ModelBrokerRequest extends Omit<ModelReviewRequest, \"validation\" | \"tools\"> {\n protocolVersion: typeof ADVERSARY_MODEL_PROTOCOL_VERSION;\n}\n\ninterface ModelBrokerResponse {\n protocolVersion: typeof ADVERSARY_MODEL_PROTOCOL_VERSION;\n output: unknown;\n provider: string;\n model: string;\n usage?: ModelReviewUsage;\n}\n\ninterface ModelBrokerErrorResponse {\n error?: {\n code?: string;\n message?: string;\n retryable?: boolean;\n };\n}\n\ntype NormalizedModelReviewRequest = Omit<ModelReviewRequest, \"budget\" | \"validation\" | \"tools\"> & {\n budget: Required<ModelReviewBudget>;\n};\n\nexport class ModelUnavailableError extends Error {\n constructor(message = \"Model review is unavailable for this adversary execution.\") {\n super(message);\n this.name = \"ModelUnavailableError\";\n }\n}\n\nexport class ModelReviewError extends Error {\n readonly code?: string;\n readonly retryable: boolean;\n readonly diagnostics?: Readonly<Record<string, unknown>>;\n\n constructor(\n message: string,\n options: {\n code?: string;\n retryable?: boolean;\n diagnostics?: Readonly<Record<string, unknown>>;\n } = {},\n ) {\n super(message);\n this.name = \"ModelReviewError\";\n this.code = options.code;\n this.diagnostics = options.diagnostics;\n this.retryable = options.retryable ?? false;\n }\n}\n\nexport function createModelFromEnvironment(\n environment: ModelEnvironment = process.env,\n): ReviewModel {\n const endpoint = environment[ADVERSARY_MODEL_ENDPOINT_ENV]?.trim();\n const token = environment[ADVERSARY_MODEL_TOKEN_ENV]?.trim();\n if (endpoint === undefined || endpoint === \"\" || token === undefined || token === \"\") {\n return unavailableModel();\n }\n return new BrokerReviewModel(endpoint, token);\n}\n\nexport function unavailableModel(): ReviewModel {\n return Object.freeze({\n async review(): Promise<never> {\n throw new ModelUnavailableError();\n },\n });\n}\n\nexport class BrokerReviewModel implements ReviewModel {\n readonly endpoint: string;\n readonly #token: string;\n readonly #maximumAttempts: number;\n readonly #initialRetryDelayMs: number;\n readonly #random: () => number;\n\n constructor(endpoint: string, token: string, options: BrokerReviewModelOptions = {}) {\n const parsed = new URL(endpoint);\n if (\n parsed.protocol !== \"http:\" ||\n (parsed.hostname !== \"127.0.0.1\" &&\n parsed.hostname !== \"::1\" &&\n parsed.hostname !== \"[::1]\" &&\n parsed.hostname !== \"localhost\")\n ) {\n throw new ModelReviewError(\n \"The model broker endpoint must use HTTP on the local loopback interface.\",\n { code: \"invalid_broker_endpoint\" },\n );\n }\n if (token.trim() === \"\") {\n throw new ModelReviewError(\"The model broker token must not be empty.\", {\n code: \"invalid_broker_token\",\n });\n }\n this.endpoint = parsed.toString();\n this.#token = token;\n const maximumAttempts = options.maximumAttempts ?? DEFAULT_BROKER_MAXIMUM_ATTEMPTS;\n const initialRetryDelayMs = options.initialRetryDelayMs ?? DEFAULT_BROKER_RETRY_DELAY_MS;\n requireIntegerRange(maximumAttempts, \"maximumAttempts\", 1, 5);\n requireIntegerRange(initialRetryDelayMs, \"initialRetryDelayMs\", 0, MAX_BROKER_RETRY_DELAY_MS);\n this.#maximumAttempts = maximumAttempts;\n this.#initialRetryDelayMs = initialRetryDelayMs;\n this.#random = options.random ?? Math.random;\n }\n\n async review<T = unknown>(request: ModelReviewRequest<T>): Promise<ModelReviewResult<T>> {\n if (request.tools?.repository !== undefined) {\n throw new ModelReviewError(\n \"Repository model tools require ctx.model so the SDK can enforce the repository boundary.\",\n { code: \"invalid_model_request\" },\n );\n }\n const normalized = normalizeRequest(request);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), normalized.budget.timeoutMs);\n try {\n for (let attempt = 1; attempt <= this.#maximumAttempts; attempt += 1) {\n try {\n return await this.#reviewOnce<T>(normalized, controller.signal);\n } catch (error) {\n if (\n !(error instanceof ModelReviewError) ||\n !error.retryable ||\n controller.signal.aborted ||\n attempt === this.#maximumAttempts\n ) {\n throw error;\n }\n const exponential = Math.min(\n MAX_BROKER_RETRY_DELAY_MS,\n this.#initialRetryDelayMs * 2 ** (attempt - 1),\n );\n const jittered = Math.round(exponential * (0.75 + 0.5 * this.#random()));\n await waitForRetry(jittered, controller.signal, normalized.budget.timeoutMs);\n }\n }\n throw new ModelReviewError(\"Model broker retry loop exhausted unexpectedly.\", {\n code: \"broker_unavailable\",\n retryable: true,\n });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n async #reviewOnce<T>(\n normalized: NormalizedModelReviewRequest,\n signal: AbortSignal,\n ): Promise<ModelReviewResult<T>> {\n let response: Response;\n try {\n response = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${this.#token}`,\n \"content-type\": \"application/json\",\n \"x-adversary-model-protocol\": String(ADVERSARY_MODEL_PROTOCOL_VERSION),\n },\n body: JSON.stringify({\n protocolVersion: ADVERSARY_MODEL_PROTOCOL_VERSION,\n prompt: normalized.prompt,\n input: normalized.input,\n schema: normalized.schema,\n budget: normalized.budget,\n } satisfies ModelBrokerRequest),\n signal,\n });\n } catch (error) {\n if (signal.aborted) {\n throw modelTimeoutError(normalized.budget.timeoutMs);\n }\n throw new ModelReviewError(\n `Model broker request failed: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"broker_unavailable\", retryable: true },\n );\n }\n\n let body: string;\n try {\n body = await readBoundedResponse(response);\n } catch (error) {\n if (signal.aborted) {\n throw modelTimeoutError(normalized.budget.timeoutMs);\n }\n throw error;\n }\n let decoded: unknown;\n try {\n decoded = JSON.parse(body);\n } catch {\n throw new ModelReviewError(\"Model broker returned malformed JSON.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (!response.ok) {\n const failure = decoded as ModelBrokerErrorResponse;\n throw new ModelReviewError(\n failure.error?.message ?? `Model broker returned HTTP ${response.status}.`,\n {\n code: failure.error?.code ?? \"model_review_failed\",\n retryable: failure.error?.retryable ?? response.status >= 500,\n },\n );\n }\n\n const envelope = requireBrokerResponse(decoded);\n validateModelOutput(normalized.schema, envelope.output);\n return {\n output: envelope.output as T,\n provider: envelope.provider,\n model: envelope.model,\n ...(envelope.usage === undefined ? {} : { usage: envelope.usage }),\n };\n }\n}\n\n/**\n * Run adversary-owned semantic validation with SDK-owned bounded regeneration.\n *\n * Each retry receives the validator failure as trusted SDK feedback while retaining the\n * original input. The original timeout is shared by all validation attempts, and usage is\n * aggregated across them. Repository callers may decorate the raw result with citations before\n * validation without repeating repository retrieval.\n */\nexport async function reviewWithValidation<T>(\n model: ReviewModel,\n request: ModelReviewRequest<T>,\n decorate: (result: ModelReviewResult<T>) => ModelReviewResult<T> = (result) => result,\n): Promise<ModelReviewResult<T>> {\n const validation = request.validation;\n const { validation: _validation, tools: _tools, ...baseRequest } = request;\n if (validation === undefined) return decorate(await model.review<T>(baseRequest));\n\n const maximumAttempts = validation.maximumAttempts ?? DEFAULT_VALIDATION_MAXIMUM_ATTEMPTS;\n requireIntegerRange(\n maximumAttempts,\n \"validation.maximumAttempts\",\n 1,\n MAX_VALIDATION_MAXIMUM_ATTEMPTS,\n );\n const timeoutMs = request.budget?.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n const startedAt = Date.now();\n let usage: ModelReviewUsage = {};\n let feedback: string | undefined;\n\n for (let attempt = 1; attempt <= maximumAttempts; attempt += 1) {\n const elapsed = Date.now() - startedAt;\n const remainingTimeoutMs = timeoutMs - elapsed;\n if (remainingTimeoutMs <= 0) throw modelTimeoutError(timeoutMs);\n const result = decorate(\n await model.review<T>({\n ...baseRequest,\n prompt:\n feedback === undefined\n ? baseRequest.prompt\n : `${baseRequest.prompt}\\n\\nSDK VALIDATION FEEDBACK:\\nThe previous response failed adversary-defined validation. Correct the response using this trusted validation result and return the complete response again.\\n${JSON.stringify({ attempt, error: feedback })}`,\n budget: {\n ...baseRequest.budget,\n timeoutMs: remainingTimeoutMs,\n },\n }),\n );\n usage = addModelUsage(usage, result.usage);\n try {\n await validation.validate(result);\n return {\n ...result,\n ...(usage.inputTokens === undefined && usage.outputTokens === undefined ? {} : { usage }),\n };\n } catch (error) {\n feedback = boundedValidationFeedback(error);\n if (attempt === maximumAttempts) {\n throw new ModelReviewError(\n `Model output failed adversary validation after ${maximumAttempts} attempts: ${feedback}`,\n { code: \"model_validation_failed\", retryable: false },\n );\n }\n }\n }\n throw new ModelReviewError(\"Model validation retry loop exhausted unexpectedly.\", {\n code: \"model_validation_failed\",\n retryable: false,\n });\n}\n\nfunction boundedValidationFeedback(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n const encoded = Buffer.from(message, \"utf8\");\n return encoded.byteLength <= MAX_VALIDATION_FEEDBACK_BYTES\n ? message\n : `${encoded.subarray(0, MAX_VALIDATION_FEEDBACK_BYTES).toString(\"utf8\")}…`;\n}\n\nfunction addModelUsage(\n total: ModelReviewUsage,\n next: ModelReviewUsage | undefined,\n): ModelReviewUsage {\n if (next === undefined) return total;\n return {\n ...(total.inputTokens === undefined && next.inputTokens === undefined\n ? {}\n : { inputTokens: (total.inputTokens ?? 0) + (next.inputTokens ?? 0) }),\n ...(total.outputTokens === undefined && next.outputTokens === undefined\n ? {}\n : { outputTokens: (total.outputTokens ?? 0) + (next.outputTokens ?? 0) }),\n };\n}\n\nasync function waitForRetry(\n delayMs: number,\n signal: AbortSignal,\n timeoutMs: number,\n): Promise<void> {\n if (signal.aborted) {\n throw modelTimeoutError(timeoutMs);\n }\n await new Promise<void>((resolve, reject) => {\n const onAbort = () => {\n clearTimeout(timer);\n reject(modelTimeoutError(timeoutMs));\n };\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction modelTimeoutError(timeoutMs: number): ModelReviewError {\n return new ModelReviewError(`Model review exceeded its ${timeoutMs}ms timeout.`, {\n code: \"model_timeout\",\n retryable: true,\n });\n}\n\nfunction normalizeRequest(request: ModelReviewRequest): NormalizedModelReviewRequest {\n if (typeof request !== \"object\" || request === null) {\n throw new ModelReviewError(\"Model review request must be an object.\", {\n code: \"invalid_model_request\",\n });\n }\n if (typeof request.prompt !== \"string\" || request.prompt.trim() === \"\") {\n throw new ModelReviewError(\"Model review prompt must be a non-empty string.\", {\n code: \"invalid_model_request\",\n });\n }\n const promptBytes = Buffer.byteLength(request.prompt, \"utf8\");\n if (promptBytes > MAX_PROMPT_BYTES) {\n throw new ModelReviewError(`Model review prompt exceeds ${MAX_PROMPT_BYTES} bytes.`, {\n code: \"model_request_too_large\",\n });\n }\n requireJsonSize(request.input, \"input\", MAX_INPUT_BYTES);\n if (\n typeof request.schema !== \"object\" ||\n request.schema === null ||\n Array.isArray(request.schema)\n ) {\n throw new ModelReviewError(\"Model review schema must be a JSON Schema object.\", {\n code: \"invalid_model_schema\",\n });\n }\n requireJsonSize(request.schema, \"schema\", MAX_SCHEMA_BYTES);\n\n const maximumOutputTokens = request.budget?.maximumOutputTokens ?? DEFAULT_MAXIMUM_OUTPUT_TOKENS;\n const timeoutMs = request.budget?.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n requireIntegerRange(\n maximumOutputTokens,\n \"budget.maximumOutputTokens\",\n 1,\n MAX_MAXIMUM_OUTPUT_TOKENS,\n );\n requireIntegerRange(timeoutMs, \"budget.timeoutMs\", 1, MAX_MODEL_TIMEOUT_MS);\n return {\n prompt: request.prompt,\n input: request.input,\n schema: request.schema,\n budget: { maximumOutputTokens, timeoutMs },\n };\n}\n\nfunction requireJsonSize(value: unknown, name: string, maximum: number): void {\n let encoded: string | undefined;\n try {\n encoded = JSON.stringify(value);\n } catch (error) {\n throw new ModelReviewError(\n `Model review ${name} must be JSON-serializable: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"invalid_model_request\" },\n );\n }\n if (encoded === undefined) {\n throw new ModelReviewError(`Model review ${name} must be JSON-serializable.`, {\n code: \"invalid_model_request\",\n });\n }\n if (Buffer.byteLength(encoded, \"utf8\") > maximum) {\n throw new ModelReviewError(`Model review ${name} exceeds ${maximum} bytes.`, {\n code: \"model_request_too_large\",\n });\n }\n}\n\nfunction requireIntegerRange(value: number, name: string, minimum: number, maximum: number): void {\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\n throw new ModelReviewError(`${name} must be an integer from ${minimum} through ${maximum}.`, {\n code: \"invalid_model_budget\",\n });\n }\n}\n\nasync function readBoundedResponse(response: Response): Promise<string> {\n const declared = response.headers.get(\"content-length\");\n if (declared !== null && Number(declared) > MAX_RESPONSE_BYTES) {\n throw new ModelReviewError(`Model broker response exceeds ${MAX_RESPONSE_BYTES} bytes.`, {\n code: \"model_response_too_large\",\n });\n }\n if (response.body === null) {\n return \"\";\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n size += value.byteLength;\n if (size > MAX_RESPONSE_BYTES) {\n await reader.cancel();\n throw new ModelReviewError(`Model broker response exceeds ${MAX_RESPONSE_BYTES} bytes.`, {\n code: \"model_response_too_large\",\n });\n }\n chunks.push(value);\n }\n const joined = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n joined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(joined);\n}\n\nfunction requireBrokerResponse(value: unknown): ModelBrokerResponse {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new ModelReviewError(\"Model broker response must be an object.\", {\n code: \"invalid_broker_response\",\n });\n }\n const response = value as Partial<ModelBrokerResponse>;\n if (response.protocolVersion !== ADVERSARY_MODEL_PROTOCOL_VERSION) {\n throw new ModelReviewError(\n `Model broker protocol version must be ${ADVERSARY_MODEL_PROTOCOL_VERSION}.`,\n { code: \"unsupported_model_protocol\" },\n );\n }\n if (typeof response.provider !== \"string\" || response.provider.trim() === \"\") {\n throw new ModelReviewError(\"Model broker response provider must be a non-empty string.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (typeof response.model !== \"string\" || response.model.trim() === \"\") {\n throw new ModelReviewError(\"Model broker response model must be a non-empty string.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (!Object.hasOwn(response, \"output\")) {\n throw new ModelReviewError(\"Model broker response is missing output.\", {\n code: \"invalid_broker_response\",\n });\n }\n if (response.usage !== undefined) {\n validateUsage(response.usage);\n }\n return response as ModelBrokerResponse;\n}\n\nfunction validateUsage(value: unknown): asserts value is ModelReviewUsage {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new ModelReviewError(\"Model broker response usage must be an object.\", {\n code: \"invalid_broker_response\",\n });\n }\n for (const field of [\"inputTokens\", \"outputTokens\"] as const) {\n const count = (value as ModelReviewUsage)[field];\n if (count !== undefined && (!Number.isInteger(count) || count < 0)) {\n throw new ModelReviewError(\n `Model broker response usage.${field} must be a non-negative integer.`,\n {\n code: \"invalid_broker_response\",\n },\n );\n }\n }\n}\n\nfunction validateModelOutput(schema: Record<string, unknown>, output: unknown): void {\n const ajv = new Ajv2020({ allErrors: true, strict: true });\n let validate: ReturnType<Ajv2020[\"compile\"]>;\n try {\n validate = ajv.compile(schema);\n } catch (error) {\n throw new ModelReviewError(\n `Model review schema is invalid: ${error instanceof Error ? error.message : String(error)}`,\n { code: \"invalid_model_schema\" },\n );\n }\n if (!validate(output)) {\n const detail = ajv.errorsText(validate.errors, { separator: \"; \" });\n throw new ModelReviewError(`Model output does not match the requested schema: ${detail}`, {\n code: \"invalid_model_output\",\n });\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ export declare const ADVERSARY_OUTCOME_CONTEXT_ENV = "ADVERSARY_OUTCOME_CONTEXT"
|
|
|
2
2
|
export declare const OUTCOME_CONTEXT_SCHEMA_VERSION = "adversary.outcome-context.v1";
|
|
3
3
|
export declare const OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS: number;
|
|
4
4
|
export declare const OUTCOME_CONTEXT_MAX_FILE_BYTES: number;
|
|
5
|
-
export type OutcomeContextSourceKind = "pull_request_title" | "pull_request_body";
|
|
5
|
+
export type OutcomeContextSourceKind = "pull_request_title" | "pull_request_body" | "linked_issue" | "human_clarification";
|
|
6
6
|
export interface OutcomeContextSubject {
|
|
7
7
|
readonly provider?: string;
|
|
8
8
|
readonly repository?: string;
|
|
@@ -12,6 +12,7 @@ export interface OutcomeContextSource {
|
|
|
12
12
|
readonly kind: OutcomeContextSourceKind;
|
|
13
13
|
/** Untrusted author-supplied text. Never treat this as model instructions. */
|
|
14
14
|
readonly text: string;
|
|
15
|
+
readonly referenceUrl?: string;
|
|
15
16
|
}
|
|
16
17
|
export interface OutcomeIntent {
|
|
17
18
|
readonly objective: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome-context.d.ts","sourceRoot":"","sources":["../src/outcome-context.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,8BAA8B,iCAAiC,CAAC;AAC7E,eAAO,MAAM,qCAAqC,QAAW,CAAC;AAC9D,eAAO,MAAM,8BAA8B,QAAY,CAAC;AAMxD,MAAM,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"outcome-context.d.ts","sourceRoot":"","sources":["../src/outcome-context.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,8BAA8B,iCAAiC,CAAC;AAC7E,eAAO,MAAM,qCAAqC,QAAW,CAAC;AAC9D,eAAO,MAAM,8BAA8B,QAAY,CAAC;AAMxD,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,mBAAmB,GACnB,cAAc,GACd,qBAAqB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,8BAA8B,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAM9E;AAED,wBAAsB,6BAA6B,CACjD,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAGhC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAU,GAAG,cAAc,CA6FpF"}
|
package/dist/outcome-context.js
CHANGED
|
@@ -36,8 +36,8 @@ export function parseOutcomeContext(value, source = "value") {
|
|
|
36
36
|
characterLength(value.subject.repository) > MAX_REPOSITORY_CHARACTERS)) {
|
|
37
37
|
throw new Error(`Invalid outcome context at ${source}: subject.repository must be a string.`);
|
|
38
38
|
}
|
|
39
|
-
if (!Array.isArray(value.sources) || value.sources.length === 0 || value.sources.length >
|
|
40
|
-
throw new Error(`Invalid outcome context at ${source}: sources must contain one
|
|
39
|
+
if (!Array.isArray(value.sources) || value.sources.length === 0 || value.sources.length > 12) {
|
|
40
|
+
throw new Error(`Invalid outcome context at ${source}: sources must contain one to twelve items.`);
|
|
41
41
|
}
|
|
42
42
|
const sources = [];
|
|
43
43
|
const kinds = new Set();
|
|
@@ -45,18 +45,33 @@ export function parseOutcomeContext(value, source = "value") {
|
|
|
45
45
|
if (!isRecord(item) || !isSourceKind(item.kind) || typeof item.text !== "string") {
|
|
46
46
|
throw new Error(`Invalid outcome context at ${source}: each source requires kind and text.`);
|
|
47
47
|
}
|
|
48
|
-
assertKeys(item, ["kind", "text"], `${source}.sources`);
|
|
48
|
+
assertKeys(item, ["kind", "text", "reference_url"], `${source}.sources`);
|
|
49
49
|
if (item.text.trim() === "") {
|
|
50
50
|
throw new Error(`Invalid outcome context at ${source}: source text must not be empty.`);
|
|
51
51
|
}
|
|
52
52
|
if (characterLength(item.text) > OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS) {
|
|
53
53
|
throw new Error(`Invalid outcome context at ${source}: source text is too long.`);
|
|
54
54
|
}
|
|
55
|
-
if (
|
|
55
|
+
if (item.kind === "linked_issue") {
|
|
56
|
+
if (typeof item.reference_url !== "string" ||
|
|
57
|
+
item.reference_url.length > 2048 ||
|
|
58
|
+
!isHttpsReferenceUrl(item.reference_url)) {
|
|
59
|
+
throw new Error(`Invalid outcome context at ${source}: linked_issue requires an HTTPS reference_url.`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (item.reference_url !== undefined) {
|
|
63
|
+
throw new Error(`Invalid outcome context at ${source}: only linked_issue may have reference_url.`);
|
|
64
|
+
}
|
|
65
|
+
if ((item.kind === "pull_request_title" || item.kind === "pull_request_body") &&
|
|
66
|
+
kinds.has(item.kind)) {
|
|
56
67
|
throw new Error(`Invalid outcome context at ${source}: source kinds must be unique.`);
|
|
57
68
|
}
|
|
58
69
|
kinds.add(item.kind);
|
|
59
|
-
sources.push(Object.freeze({
|
|
70
|
+
sources.push(Object.freeze({
|
|
71
|
+
kind: item.kind,
|
|
72
|
+
text: item.text,
|
|
73
|
+
...(typeof item.reference_url === "string" ? { referenceUrl: item.reference_url } : {}),
|
|
74
|
+
}));
|
|
60
75
|
}
|
|
61
76
|
const intent = parseIntent(value.intent, source);
|
|
62
77
|
const pullRequest = value.subject.pull_request;
|
|
@@ -123,7 +138,23 @@ function isConfidence(value) {
|
|
|
123
138
|
return value === "low" || value === "medium" || value === "high";
|
|
124
139
|
}
|
|
125
140
|
function isSourceKind(value) {
|
|
126
|
-
return value === "pull_request_title" ||
|
|
141
|
+
return (value === "pull_request_title" ||
|
|
142
|
+
value === "pull_request_body" ||
|
|
143
|
+
value === "linked_issue" ||
|
|
144
|
+
value === "human_clarification");
|
|
145
|
+
}
|
|
146
|
+
function isHttpsReferenceUrl(value) {
|
|
147
|
+
try {
|
|
148
|
+
const url = new URL(value);
|
|
149
|
+
return (/^https:\/\/[^/@?#]+\//.test(value) &&
|
|
150
|
+
url.protocol === "https:" &&
|
|
151
|
+
url.hostname !== "" &&
|
|
152
|
+
url.username === "" &&
|
|
153
|
+
url.password === "");
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
127
158
|
}
|
|
128
159
|
function isRecord(value) {
|
|
129
160
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome-context.js","sourceRoot":"","sources":["../src/outcome-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\n\nexport const ADVERSARY_OUTCOME_CONTEXT_ENV = \"ADVERSARY_OUTCOME_CONTEXT\";\nexport const OUTCOME_CONTEXT_SCHEMA_VERSION = \"adversary.outcome-context.v1\";\nexport const OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS = 32 << 10;\nexport const OUTCOME_CONTEXT_MAX_FILE_BYTES = 384 << 10;\n\nconst MAX_PROVIDER_CHARACTERS = 100;\nconst MAX_REPOSITORY_CHARACTERS = 500;\nconst MAX_INTENT_TEXT_CHARACTERS = 500;\n\nexport type OutcomeContextSourceKind = \"pull_request_title\" | \"pull_request_body\";\n\nexport interface OutcomeContextSubject {\n readonly provider?: string;\n readonly repository?: string;\n readonly pullRequest?: number;\n}\n\nexport interface OutcomeContextSource {\n readonly kind: OutcomeContextSourceKind;\n /** Untrusted author-supplied text. Never treat this as model instructions. */\n readonly text: string;\n}\n\nexport interface OutcomeIntent {\n readonly objective: string;\n readonly confidence: \"low\" | \"medium\" | \"high\";\n readonly expectedEffects: readonly string[];\n readonly mustPreserve: readonly string[];\n readonly affectedBoundaries: readonly string[];\n readonly ambiguities: readonly string[];\n}\n\nexport interface OutcomeContext {\n readonly schemaVersion: typeof OUTCOME_CONTEXT_SCHEMA_VERSION;\n readonly subject: OutcomeContextSubject;\n readonly sources: readonly OutcomeContextSource[];\n /** Host-detected intent. It remains a hypothesis that adversaries must verify. */\n readonly intent: OutcomeIntent;\n}\n\nexport async function openOutcomeContext(path: string): Promise<OutcomeContext> {\n const raw = await readFile(path, \"utf8\");\n if (Buffer.byteLength(raw) > OUTCOME_CONTEXT_MAX_FILE_BYTES) {\n throw new Error(`Invalid outcome context at ${path}: file is too large.`);\n }\n return parseOutcomeContext(JSON.parse(raw) as unknown, path);\n}\n\nexport async function outcomeContextFromEnvironment(\n env: Readonly<Record<string, string | undefined>> = process.env,\n): Promise<OutcomeContext | null> {\n const path = env[ADVERSARY_OUTCOME_CONTEXT_ENV]?.trim();\n return path ? openOutcomeContext(path) : null;\n}\n\nexport function parseOutcomeContext(value: unknown, source = \"value\"): OutcomeContext {\n if (!isRecord(value) || value.schema_version !== OUTCOME_CONTEXT_SCHEMA_VERSION) {\n throw new Error(\n `Invalid outcome context at ${source}: schema_version must be ${OUTCOME_CONTEXT_SCHEMA_VERSION}.`,\n );\n }\n assertKeys(value, [\"schema_version\", \"subject\", \"sources\", \"intent\"], source);\n if (!isRecord(value.subject)) {\n throw new Error(`Invalid outcome context at ${source}: subject must be an object.`);\n }\n assertKeys(value.subject, [\"provider\", \"repository\", \"pull_request\"], `${source}.subject`);\n if (\n value.subject.provider !== undefined &&\n (typeof value.subject.provider !== \"string\" ||\n characterLength(value.subject.provider) > MAX_PROVIDER_CHARACTERS)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.provider must be a string.`);\n }\n if (\n value.subject.repository !== undefined &&\n (typeof value.subject.repository !== \"string\" ||\n characterLength(value.subject.repository) > MAX_REPOSITORY_CHARACTERS)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.repository must be a string.`);\n }\n if (!Array.isArray(value.sources) || value.sources.length === 0 || value.sources.length > 2) {\n throw new Error(`Invalid outcome context at ${source}: sources must contain one or two items.`);\n }\n const sources: OutcomeContextSource[] = [];\n const kinds = new Set<OutcomeContextSourceKind>();\n for (const item of value.sources) {\n if (!isRecord(item) || !isSourceKind(item.kind) || typeof item.text !== \"string\") {\n throw new Error(`Invalid outcome context at ${source}: each source requires kind and text.`);\n }\n assertKeys(item, [\"kind\", \"text\"], `${source}.sources`);\n if (item.text.trim() === \"\") {\n throw new Error(`Invalid outcome context at ${source}: source text must not be empty.`);\n }\n if (characterLength(item.text) > OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS) {\n throw new Error(`Invalid outcome context at ${source}: source text is too long.`);\n }\n if (kinds.has(item.kind)) {\n throw new Error(`Invalid outcome context at ${source}: source kinds must be unique.`);\n }\n kinds.add(item.kind);\n sources.push(Object.freeze({ kind: item.kind, text: item.text }));\n }\n const intent = parseIntent(value.intent, source);\n const pullRequest = value.subject.pull_request;\n if (\n pullRequest !== undefined &&\n (!Number.isInteger(pullRequest) || (pullRequest as number) < 1)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.pull_request must be positive.`);\n }\n return Object.freeze({\n schemaVersion: OUTCOME_CONTEXT_SCHEMA_VERSION,\n subject: Object.freeze({\n ...(typeof value.subject.provider === \"string\" ? { provider: value.subject.provider } : {}),\n ...(typeof value.subject.repository === \"string\"\n ? { repository: value.subject.repository }\n : {}),\n ...(typeof pullRequest === \"number\" ? { pullRequest } : {}),\n }),\n sources: Object.freeze(sources),\n intent,\n });\n}\n\nfunction parseIntent(value: unknown, source: string): OutcomeIntent {\n if (!isRecord(value)) {\n throw new Error(`Invalid outcome context at ${source}: intent must be an object.`);\n }\n assertKeys(\n value,\n [\n \"objective\",\n \"confidence\",\n \"expected_effects\",\n \"must_preserve\",\n \"affected_boundaries\",\n \"ambiguities\",\n ],\n `${source}.intent`,\n );\n if (\n typeof value.objective !== \"string\" ||\n value.objective.trim() === \"\" ||\n characterLength(value.objective) > MAX_INTENT_TEXT_CHARACTERS\n ) {\n throw new Error(`Invalid outcome context at ${source}: intent.objective must not be empty.`);\n }\n if (!isConfidence(value.confidence)) {\n throw new Error(`Invalid outcome context at ${source}: intent.confidence is invalid.`);\n }\n return Object.freeze({\n objective: value.objective,\n confidence: value.confidence,\n expectedEffects: parseStringList(value.expected_effects, source, \"expected_effects\"),\n mustPreserve: parseStringList(value.must_preserve, source, \"must_preserve\"),\n affectedBoundaries: parseStringList(value.affected_boundaries, source, \"affected_boundaries\"),\n ambiguities: parseStringList(value.ambiguities, source, \"ambiguities\"),\n });\n}\n\nfunction parseStringList(value: unknown, source: string, field: string): readonly string[] {\n if (\n !Array.isArray(value) ||\n value.length > 12 ||\n value.some(\n (item) =>\n typeof item !== \"string\" ||\n item.trim() === \"\" ||\n characterLength(item) > MAX_INTENT_TEXT_CHARACTERS,\n )\n ) {\n throw new Error(\n `Invalid outcome context at ${source}: intent.${field} must be a bounded string array.`,\n );\n }\n return Object.freeze([...value]);\n}\n\nfunction characterLength(value: string): number {\n return [...value].length;\n}\n\nfunction isConfidence(value: unknown): value is OutcomeIntent[\"confidence\"] {\n return value === \"low\" || value === \"medium\" || value === \"high\";\n}\n\nfunction isSourceKind(value: unknown): value is OutcomeContextSourceKind {\n return value === \"pull_request_title\" || value === \"pull_request_body\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n source: string,\n): void {\n const allowedKeys = new Set(allowed);\n const unknown = Object.keys(value).find((key) => !allowedKeys.has(key));\n if (unknown !== undefined) {\n throw new Error(`Invalid outcome context at ${source}: unknown property ${unknown}.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"outcome-context.js","sourceRoot":"","sources":["../src/outcome-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\n\nexport const ADVERSARY_OUTCOME_CONTEXT_ENV = \"ADVERSARY_OUTCOME_CONTEXT\";\nexport const OUTCOME_CONTEXT_SCHEMA_VERSION = \"adversary.outcome-context.v1\";\nexport const OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS = 32 << 10;\nexport const OUTCOME_CONTEXT_MAX_FILE_BYTES = 384 << 10;\n\nconst MAX_PROVIDER_CHARACTERS = 100;\nconst MAX_REPOSITORY_CHARACTERS = 500;\nconst MAX_INTENT_TEXT_CHARACTERS = 500;\n\nexport type OutcomeContextSourceKind =\n | \"pull_request_title\"\n | \"pull_request_body\"\n | \"linked_issue\"\n | \"human_clarification\";\n\nexport interface OutcomeContextSubject {\n readonly provider?: string;\n readonly repository?: string;\n readonly pullRequest?: number;\n}\n\nexport interface OutcomeContextSource {\n readonly kind: OutcomeContextSourceKind;\n /** Untrusted author-supplied text. Never treat this as model instructions. */\n readonly text: string;\n readonly referenceUrl?: string;\n}\n\nexport interface OutcomeIntent {\n readonly objective: string;\n readonly confidence: \"low\" | \"medium\" | \"high\";\n readonly expectedEffects: readonly string[];\n readonly mustPreserve: readonly string[];\n readonly affectedBoundaries: readonly string[];\n readonly ambiguities: readonly string[];\n}\n\nexport interface OutcomeContext {\n readonly schemaVersion: typeof OUTCOME_CONTEXT_SCHEMA_VERSION;\n readonly subject: OutcomeContextSubject;\n readonly sources: readonly OutcomeContextSource[];\n /** Host-detected intent. It remains a hypothesis that adversaries must verify. */\n readonly intent: OutcomeIntent;\n}\n\nexport async function openOutcomeContext(path: string): Promise<OutcomeContext> {\n const raw = await readFile(path, \"utf8\");\n if (Buffer.byteLength(raw) > OUTCOME_CONTEXT_MAX_FILE_BYTES) {\n throw new Error(`Invalid outcome context at ${path}: file is too large.`);\n }\n return parseOutcomeContext(JSON.parse(raw) as unknown, path);\n}\n\nexport async function outcomeContextFromEnvironment(\n env: Readonly<Record<string, string | undefined>> = process.env,\n): Promise<OutcomeContext | null> {\n const path = env[ADVERSARY_OUTCOME_CONTEXT_ENV]?.trim();\n return path ? openOutcomeContext(path) : null;\n}\n\nexport function parseOutcomeContext(value: unknown, source = \"value\"): OutcomeContext {\n if (!isRecord(value) || value.schema_version !== OUTCOME_CONTEXT_SCHEMA_VERSION) {\n throw new Error(\n `Invalid outcome context at ${source}: schema_version must be ${OUTCOME_CONTEXT_SCHEMA_VERSION}.`,\n );\n }\n assertKeys(value, [\"schema_version\", \"subject\", \"sources\", \"intent\"], source);\n if (!isRecord(value.subject)) {\n throw new Error(`Invalid outcome context at ${source}: subject must be an object.`);\n }\n assertKeys(value.subject, [\"provider\", \"repository\", \"pull_request\"], `${source}.subject`);\n if (\n value.subject.provider !== undefined &&\n (typeof value.subject.provider !== \"string\" ||\n characterLength(value.subject.provider) > MAX_PROVIDER_CHARACTERS)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.provider must be a string.`);\n }\n if (\n value.subject.repository !== undefined &&\n (typeof value.subject.repository !== \"string\" ||\n characterLength(value.subject.repository) > MAX_REPOSITORY_CHARACTERS)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.repository must be a string.`);\n }\n if (!Array.isArray(value.sources) || value.sources.length === 0 || value.sources.length > 12) {\n throw new Error(\n `Invalid outcome context at ${source}: sources must contain one to twelve items.`,\n );\n }\n const sources: OutcomeContextSource[] = [];\n const kinds = new Set<OutcomeContextSourceKind>();\n for (const item of value.sources) {\n if (!isRecord(item) || !isSourceKind(item.kind) || typeof item.text !== \"string\") {\n throw new Error(`Invalid outcome context at ${source}: each source requires kind and text.`);\n }\n assertKeys(item, [\"kind\", \"text\", \"reference_url\"], `${source}.sources`);\n if (item.text.trim() === \"\") {\n throw new Error(`Invalid outcome context at ${source}: source text must not be empty.`);\n }\n if (characterLength(item.text) > OUTCOME_CONTEXT_MAX_SOURCE_CHARACTERS) {\n throw new Error(`Invalid outcome context at ${source}: source text is too long.`);\n }\n if (item.kind === \"linked_issue\") {\n if (\n typeof item.reference_url !== \"string\" ||\n item.reference_url.length > 2048 ||\n !isHttpsReferenceUrl(item.reference_url)\n ) {\n throw new Error(\n `Invalid outcome context at ${source}: linked_issue requires an HTTPS reference_url.`,\n );\n }\n } else if (item.reference_url !== undefined) {\n throw new Error(\n `Invalid outcome context at ${source}: only linked_issue may have reference_url.`,\n );\n }\n if (\n (item.kind === \"pull_request_title\" || item.kind === \"pull_request_body\") &&\n kinds.has(item.kind)\n ) {\n throw new Error(`Invalid outcome context at ${source}: source kinds must be unique.`);\n }\n kinds.add(item.kind);\n sources.push(\n Object.freeze({\n kind: item.kind,\n text: item.text,\n ...(typeof item.reference_url === \"string\" ? { referenceUrl: item.reference_url } : {}),\n }),\n );\n }\n const intent = parseIntent(value.intent, source);\n const pullRequest = value.subject.pull_request;\n if (\n pullRequest !== undefined &&\n (!Number.isInteger(pullRequest) || (pullRequest as number) < 1)\n ) {\n throw new Error(`Invalid outcome context at ${source}: subject.pull_request must be positive.`);\n }\n return Object.freeze({\n schemaVersion: OUTCOME_CONTEXT_SCHEMA_VERSION,\n subject: Object.freeze({\n ...(typeof value.subject.provider === \"string\" ? { provider: value.subject.provider } : {}),\n ...(typeof value.subject.repository === \"string\"\n ? { repository: value.subject.repository }\n : {}),\n ...(typeof pullRequest === \"number\" ? { pullRequest } : {}),\n }),\n sources: Object.freeze(sources),\n intent,\n });\n}\n\nfunction parseIntent(value: unknown, source: string): OutcomeIntent {\n if (!isRecord(value)) {\n throw new Error(`Invalid outcome context at ${source}: intent must be an object.`);\n }\n assertKeys(\n value,\n [\n \"objective\",\n \"confidence\",\n \"expected_effects\",\n \"must_preserve\",\n \"affected_boundaries\",\n \"ambiguities\",\n ],\n `${source}.intent`,\n );\n if (\n typeof value.objective !== \"string\" ||\n value.objective.trim() === \"\" ||\n characterLength(value.objective) > MAX_INTENT_TEXT_CHARACTERS\n ) {\n throw new Error(`Invalid outcome context at ${source}: intent.objective must not be empty.`);\n }\n if (!isConfidence(value.confidence)) {\n throw new Error(`Invalid outcome context at ${source}: intent.confidence is invalid.`);\n }\n return Object.freeze({\n objective: value.objective,\n confidence: value.confidence,\n expectedEffects: parseStringList(value.expected_effects, source, \"expected_effects\"),\n mustPreserve: parseStringList(value.must_preserve, source, \"must_preserve\"),\n affectedBoundaries: parseStringList(value.affected_boundaries, source, \"affected_boundaries\"),\n ambiguities: parseStringList(value.ambiguities, source, \"ambiguities\"),\n });\n}\n\nfunction parseStringList(value: unknown, source: string, field: string): readonly string[] {\n if (\n !Array.isArray(value) ||\n value.length > 12 ||\n value.some(\n (item) =>\n typeof item !== \"string\" ||\n item.trim() === \"\" ||\n characterLength(item) > MAX_INTENT_TEXT_CHARACTERS,\n )\n ) {\n throw new Error(\n `Invalid outcome context at ${source}: intent.${field} must be a bounded string array.`,\n );\n }\n return Object.freeze([...value]);\n}\n\nfunction characterLength(value: string): number {\n return [...value].length;\n}\n\nfunction isConfidence(value: unknown): value is OutcomeIntent[\"confidence\"] {\n return value === \"low\" || value === \"medium\" || value === \"high\";\n}\n\nfunction isSourceKind(value: unknown): value is OutcomeContextSourceKind {\n return (\n value === \"pull_request_title\" ||\n value === \"pull_request_body\" ||\n value === \"linked_issue\" ||\n value === \"human_clarification\"\n );\n}\n\nfunction isHttpsReferenceUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n /^https:\\/\\/[^/@?#]+\\//.test(value) &&\n url.protocol === \"https:\" &&\n url.hostname !== \"\" &&\n url.username === \"\" &&\n url.password === \"\"\n );\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n source: string,\n): void {\n const allowedKeys = new Set(allowed);\n const unknown = Object.keys(value).find((key) => !allowedKeys.has(key));\n if (unknown !== undefined) {\n throw new Error(`Invalid outcome context at ${source}: unknown property ${unknown}.`);\n }\n}\n"]}
|
|
@@ -26,6 +26,12 @@ export interface ModelRepositoryRetrieval {
|
|
|
26
26
|
filesRead: number;
|
|
27
27
|
directoriesListed: number;
|
|
28
28
|
exhausted: boolean;
|
|
29
|
+
/** Planning rounds recovered by reading changed source before accepting ready. */
|
|
30
|
+
sourceReadRecoveries?: number;
|
|
31
|
+
/** All in-scope head hunks are covered, or patches have no head text hunks. */
|
|
32
|
+
changedHunksCovered?: boolean;
|
|
33
|
+
/** Changed files omitted from the bounded 500-file summary; coverage is partial. */
|
|
34
|
+
omittedChangedFiles?: number;
|
|
29
35
|
}
|
|
30
36
|
export interface ModelRepositoryChange {
|
|
31
37
|
baseRef?: string;
|
|
@@ -34,5 +40,5 @@ export interface ModelRepositoryChange {
|
|
|
34
40
|
worktree: boolean;
|
|
35
41
|
}
|
|
36
42
|
export declare function resolveModelCitation(citations: readonly ModelRepositoryCitation[] | undefined, citationId: string, line: number): ModelRepositoryCitation | undefined;
|
|
37
|
-
export declare function reviewWithRepositoryTools<T>(model: ReviewModel, repositoryRoot: string | undefined, request: ModelReviewRequest, change?: ModelRepositoryChange | null): Promise<ModelReviewResult<T>>;
|
|
43
|
+
export declare function reviewWithRepositoryTools<T>(model: ReviewModel, repositoryRoot: string | undefined, request: ModelReviewRequest, change?: ModelRepositoryChange | null, reviewer?: string): Promise<ModelReviewResult<T>>;
|
|
38
44
|
//# sourceMappingURL=repository-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-model.d.ts","sourceRoot":"","sources":["../src/repository-model.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"repository-model.d.ts","sourceRoot":"","sources":["../src/repository-model.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAkCpB,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,uBAAuB,EAAE,GAAG,SAAS,EACzD,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,uBAAuB,GAAG,SAAS,CAOrC;AAiHD,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,qBAAqB,GAAG,IAAI,EACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CA+P/B"}
|