witnora 0.13.8 → 0.13.10

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/README.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Witnora CLI
2
2
 
3
+ ## Customer Evaluator Kit
4
+
5
+ `witnora/evaluator-kit` exports `createBusinessTaskEvaluatorServer()` for the customer-side
6
+ Replay and Shadow evaluator consumed by the managed Workflow Harness. It listens only on a
7
+ literal loopback address, requires a pinned bearer credential and contract digest, validates
8
+ the exact Business Task binding, and returns only the structured evaluation report. Customer
9
+ scenario inputs and candidate callbacks stay in the customer process. Replay can execute only
10
+ through the supplied synthetic sandbox harness; Shadow exposes no write interface.
11
+
3
12
  Unified release assurance, evidence, corpus, monitor, and lab CLI for Witnora.
4
13
 
5
14
  Witnora checks what an agent may do, whether it passed pre-release evidence,
package/dist/gateway.js CHANGED
@@ -578,7 +578,8 @@ export async function createConfiguredWorkflowHarness(input) {
578
578
  const healthBody = await health.json().catch(() => ({}));
579
579
  if (!health.ok
580
580
  || healthBody.schemaVersion !== "witnora.business_task_evaluator.v0.1"
581
- || healthBody.contractSha256 !== input.config.evaluatorContractSha256) {
581
+ || healthBody.contractSha256 !== input.config.evaluatorContractSha256
582
+ || healthBody.ready !== true) {
582
583
  throw new Error("Managed Workflow evaluator health did not match its pinned local contract.");
583
584
  }
584
585
  const hosted = input.managed.createManagedWorkflowHostedClient({
@@ -0,0 +1,50 @@
1
+ import type { SandboxCertificationHarness } from "./sandbox-harness.js";
2
+ import { type ShadowCandidateEvaluation, type TaskCandidateEvaluation, type TaskEvaluationContract, type TaskEvaluationScenario } from "./task-evaluation.js";
3
+ export declare const BUSINESS_TASK_EVALUATOR_SCHEMA_VERSION: "witnora.business_task_evaluator.v0.1";
4
+ export declare const BUSINESS_TASK_EVALUATION_REQUEST_SCHEMA_VERSION: "witnora.business_task_evaluation_request.v0.1";
5
+ export interface BusinessTaskEvaluationBinding {
6
+ nodeId: string;
7
+ taskContractId: string;
8
+ taskContractDigestSha256: string;
9
+ taskKey: string;
10
+ agentId: string;
11
+ agentVersion: string;
12
+ baselineAgentVersion?: string;
13
+ mode: "REPLAY" | "SHADOW";
14
+ }
15
+ export interface BusinessTaskEvaluatorServerOptions {
16
+ credential: string;
17
+ contractSha256: string;
18
+ host?: "127.0.0.1" | "::1";
19
+ port?: number;
20
+ maxBodyBytes?: number;
21
+ maxConcurrency?: number;
22
+ evaluationTimeoutMs?: number;
23
+ loadReplayScenarios?(task: TaskEvaluationContract, binding: BusinessTaskEvaluationBinding, signal: AbortSignal): Promise<TaskEvaluationScenario[]>;
24
+ createReplayHarness?(task: TaskEvaluationContract, binding: BusinessTaskEvaluationBinding, signal: AbortSignal): Promise<{
25
+ harness: SandboxCertificationHarness;
26
+ tenantId: string;
27
+ }>;
28
+ evaluateReplayCandidate?(scenario: {
29
+ id: string;
30
+ source: TaskEvaluationScenario["source"];
31
+ input: unknown;
32
+ }, task: TaskEvaluationContract, binding: BusinessTaskEvaluationBinding, signal: AbortSignal): Promise<TaskCandidateEvaluation>;
33
+ loadShadowObservations?(task: TaskEvaluationContract, binding: BusinessTaskEvaluationBinding, signal: AbortSignal): Promise<TaskEvaluationScenario[]>;
34
+ evaluateShadowCandidate?(context: {
35
+ id: string;
36
+ source: "LIVE_SHADOW";
37
+ input: unknown;
38
+ propose: (intent: {
39
+ pathId: string;
40
+ parametersDigestSha256: string;
41
+ }) => void;
42
+ }, task: TaskEvaluationContract, binding: BusinessTaskEvaluationBinding, signal: AbortSignal): Promise<ShadowCandidateEvaluation>;
43
+ }
44
+ export declare function createBusinessTaskEvaluatorServer(options: BusinessTaskEvaluatorServerOptions): {
45
+ start(): Promise<{
46
+ origin: string;
47
+ }>;
48
+ close(): Promise<void>;
49
+ };
50
+ //# sourceMappingURL=business-task-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-task-evaluator.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/business-task-evaluator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAE3B,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,sCAAsC,EAAG,sCAA+C,CAAC;AACtG,eAAO,MAAM,+CAA+C,EAAG,+CAAwD,CAAC;AAExH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC3B;AAED,MAAM,WAAW,kCAAkC;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACnJ,mBAAmB,CAAC,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,2BAA2B,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrL,uBAAuB,CAAC,CAAC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1O,sBAAsB,CAAC,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACtJ,uBAAuB,CAAC,CAAC,OAAO,EAAE;QAChC,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,aAAa,CAAC;QACtB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,sBAAsB,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/E,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnI;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,kCAAkC;aA+C1E,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;aAQ3B,OAAO,CAAC,IAAI,CAAC;EAK/B"}
@@ -0,0 +1,187 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { runReplayEvaluation, runShadowEvaluation, } from "./task-evaluation.js";
4
+ export const BUSINESS_TASK_EVALUATOR_SCHEMA_VERSION = "witnora.business_task_evaluator.v0.1";
5
+ export const BUSINESS_TASK_EVALUATION_REQUEST_SCHEMA_VERSION = "witnora.business_task_evaluation_request.v0.1";
6
+ export function createBusinessTaskEvaluatorServer(options) {
7
+ const host = options.host ?? "127.0.0.1";
8
+ if (host !== "127.0.0.1" && host !== "::1")
9
+ throw new Error("Business Task Evaluator accepts only a literal loopback host.");
10
+ const credential = required(options.credential, "credential");
11
+ const contractSha256 = digest(options.contractSha256, "contractSha256");
12
+ const port = bounded(options.port ?? 0, 0, 65_535, "port");
13
+ const maxBodyBytes = bounded(options.maxBodyBytes ?? 1_048_576, 1_024, 4_194_304, "maxBodyBytes");
14
+ const maxConcurrency = bounded(options.maxConcurrency ?? 4, 1, 16, "maxConcurrency");
15
+ const evaluationTimeoutMs = bounded(options.evaluationTimeoutMs ?? 120_000, 1_000, 600_000, "evaluationTimeoutMs");
16
+ const modes = [
17
+ ...(options.loadReplayScenarios && options.createReplayHarness && options.evaluateReplayCandidate ? ["REPLAY"] : []),
18
+ ...(options.loadShadowObservations && options.evaluateShadowCandidate ? ["SHADOW"] : []),
19
+ ];
20
+ let active = 0;
21
+ const server = createServer(async (request, response) => {
22
+ response.setHeader("cache-control", "no-store");
23
+ response.setHeader("content-type", "application/json; charset=utf-8");
24
+ try {
25
+ if (!authorized(request, credential))
26
+ return send(response, 401, { error: "unauthorized" });
27
+ if (request.method === "GET" && request.url === "/healthz") {
28
+ return send(response, 200, {
29
+ schemaVersion: BUSINESS_TASK_EVALUATOR_SCHEMA_VERSION,
30
+ contractSha256,
31
+ ready: modes.length > 0,
32
+ modes,
33
+ boundary: { host, productionWrites: 0, rawInputsRetainedByCustomer: true },
34
+ });
35
+ }
36
+ if (request.method !== "POST" || request.url !== "/v1/evaluate")
37
+ return send(response, 404, { error: "not_found" });
38
+ if (!String(request.headers["content-type"] ?? "").toLowerCase().startsWith("application/json")) {
39
+ return send(response, 415, { error: "json_required" });
40
+ }
41
+ if (active >= maxConcurrency)
42
+ return send(response, 429, { error: "evaluator_busy" });
43
+ const body = await readJson(request, maxBodyBytes);
44
+ const parsed = parseRequest(body);
45
+ validateBinding(parsed.task, parsed.evaluation);
46
+ active += 1;
47
+ try {
48
+ const report = await withTimeout((signal) => evaluate(options, parsed.task, parsed.evaluation, signal), evaluationTimeoutMs);
49
+ return send(response, 200, { schemaVersion: BUSINESS_TASK_EVALUATOR_SCHEMA_VERSION, report });
50
+ }
51
+ finally {
52
+ active -= 1;
53
+ }
54
+ }
55
+ catch (error) {
56
+ const status = error instanceof EvaluatorError ? error.status : 422;
57
+ return send(response, status, { error: error instanceof EvaluatorError ? error.code : "evaluation_failed" });
58
+ }
59
+ });
60
+ return {
61
+ async start() {
62
+ if (!server.listening)
63
+ await new Promise((resolve, reject) => {
64
+ server.once("error", reject);
65
+ server.listen(port, host, () => { server.off("error", reject); resolve(); });
66
+ });
67
+ const address = server.address();
68
+ return { origin: `http://${host === "::1" ? "[::1]" : host}:${address.port}` };
69
+ },
70
+ async close() {
71
+ if (!server.listening)
72
+ return;
73
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
74
+ },
75
+ };
76
+ }
77
+ async function evaluate(options, task, binding, signal) {
78
+ if (binding.mode === "REPLAY") {
79
+ if (!options.loadReplayScenarios || !options.createReplayHarness || !options.evaluateReplayCandidate) {
80
+ throw new EvaluatorError(409, "replay_not_configured");
81
+ }
82
+ const [{ harness, tenantId }, scenarios] = await Promise.all([
83
+ options.createReplayHarness(task, binding, signal), options.loadReplayScenarios(task, binding, signal),
84
+ ]);
85
+ return runReplayEvaluation({
86
+ task, harness, tenantId, scenarios,
87
+ evaluateCandidate: (scenario) => options.evaluateReplayCandidate(scenario, task, binding, signal),
88
+ });
89
+ }
90
+ if (!options.loadShadowObservations || !options.evaluateShadowCandidate)
91
+ throw new EvaluatorError(409, "shadow_not_configured");
92
+ return runShadowEvaluation({
93
+ task,
94
+ observations: await options.loadShadowObservations(task, binding, signal),
95
+ evaluateCandidate: (context) => options.evaluateShadowCandidate(context, task, binding, signal),
96
+ });
97
+ }
98
+ function parseRequest(input) {
99
+ const body = object(input, "request");
100
+ exactKeys(body, ["schemaVersion", "task", "evaluation"], "request");
101
+ if (body.schemaVersion !== BUSINESS_TASK_EVALUATION_REQUEST_SCHEMA_VERSION)
102
+ throw new EvaluatorError(422, "invalid_schema");
103
+ const evaluation = object(body.evaluation, "evaluation");
104
+ exactKeys(evaluation, ["nodeId", "taskContractId", "taskContractDigestSha256", "taskKey", "agentId", "agentVersion", "baselineAgentVersion", "mode"], "evaluation");
105
+ if (evaluation.mode !== "REPLAY" && evaluation.mode !== "SHADOW")
106
+ throw new EvaluatorError(422, "invalid_mode");
107
+ const binding = {
108
+ nodeId: requiredString(evaluation.nodeId), taskContractId: requiredString(evaluation.taskContractId),
109
+ taskContractDigestSha256: digest(String(evaluation.taskContractDigestSha256 ?? ""), "taskContractDigestSha256"),
110
+ taskKey: requiredString(evaluation.taskKey), agentId: requiredString(evaluation.agentId),
111
+ agentVersion: requiredString(evaluation.agentVersion),
112
+ ...(evaluation.baselineAgentVersion === undefined ? {} : { baselineAgentVersion: requiredString(evaluation.baselineAgentVersion) }),
113
+ mode: evaluation.mode,
114
+ };
115
+ return { task: object(body.task, "task"), evaluation: binding };
116
+ }
117
+ function validateBinding(task, binding) {
118
+ if (task.id !== binding.taskContractId || task.digestSha256 !== binding.taskContractDigestSha256
119
+ || task.taskKey !== binding.taskKey || task.subject?.agentId !== binding.agentId
120
+ || task.subject?.agentVersion !== (binding.baselineAgentVersion ?? binding.agentVersion))
121
+ throw new EvaluatorError(409, "task_binding_mismatch");
122
+ }
123
+ function authorized(request, credential) {
124
+ const supplied = String(request.headers.authorization ?? "").replace(/^Bearer\s+/i, "");
125
+ const left = Buffer.from(supplied);
126
+ const right = Buffer.from(credential);
127
+ return left.length === right.length && left.length > 0 && timingSafeEqual(left, right);
128
+ }
129
+ async function readJson(request, limit) {
130
+ const chunks = [];
131
+ let size = 0;
132
+ for await (const chunk of request) {
133
+ const value = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
134
+ size += value.length;
135
+ if (size > limit)
136
+ throw new EvaluatorError(413, "body_too_large");
137
+ chunks.push(value);
138
+ }
139
+ try {
140
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
141
+ }
142
+ catch {
143
+ throw new EvaluatorError(400, "invalid_json");
144
+ }
145
+ }
146
+ async function withTimeout(execute, timeoutMs) {
147
+ const controller = new AbortController();
148
+ let timer;
149
+ try {
150
+ return await Promise.race([execute(controller.signal), new Promise((_, reject) => {
151
+ timer = setTimeout(() => { controller.abort(); reject(new EvaluatorError(504, "evaluation_timeout")); }, timeoutMs);
152
+ timer.unref?.();
153
+ })]);
154
+ }
155
+ finally {
156
+ if (timer)
157
+ clearTimeout(timer);
158
+ }
159
+ }
160
+ function send(response, status, body) { response.statusCode = status; response.end(JSON.stringify(body)); }
161
+ function object(value, name) {
162
+ if (!value || typeof value !== "object" || Array.isArray(value))
163
+ throw new EvaluatorError(422, `invalid_${name}`);
164
+ return value;
165
+ }
166
+ function exactKeys(value, allowed, name) {
167
+ const keys = new Set(allowed);
168
+ if (Object.keys(value).some((key) => !keys.has(key)))
169
+ throw new EvaluatorError(422, `unexpected_${name}_field`);
170
+ }
171
+ function required(value, name) { const result = value.trim(); if (!result)
172
+ throw new Error(`${name} is required.`); return result; }
173
+ function requiredString(value) { if (typeof value !== "string" || !value.trim())
174
+ throw new EvaluatorError(422, "invalid_binding"); return value.trim(); }
175
+ function digest(value, name) { if (!/^[a-f0-9]{64}$/.test(value))
176
+ throw new Error(`${name} must be a lowercase SHA-256 digest.`); return value; }
177
+ function bounded(value, min, max, name) { if (!Number.isInteger(value) || value < min || value > max)
178
+ throw new Error(`${name} must be between ${min} and ${max}.`); return value; }
179
+ class EvaluatorError extends Error {
180
+ status;
181
+ code;
182
+ constructor(status, code) {
183
+ super(code);
184
+ this.status = status;
185
+ this.code = code;
186
+ }
187
+ }
@@ -29,8 +29,37 @@ export interface ManagedWorkflowReadyEvaluation {
29
29
  taskKey: string;
30
30
  agentId: string;
31
31
  agentVersion: string;
32
+ baselineAgentVersion?: string;
32
33
  mode: ManagedWorkflowEvaluationMode;
33
34
  }
35
+ export interface ManagedAutopilotDispatchPlan {
36
+ schemaVersion: "witnora.nora_assurance_autopilot.v0.1";
37
+ projectId: string;
38
+ generatedAt: string;
39
+ dispatches: Array<{
40
+ id: string;
41
+ projectId: string;
42
+ taskContractId: string;
43
+ taskContractDigestSha256: string;
44
+ taskKey: string;
45
+ taskVersion: number;
46
+ agentId: string;
47
+ baselineAgentVersion: string;
48
+ candidateAgentVersion: string;
49
+ mode: ManagedWorkflowEvaluationMode;
50
+ changeIds: string[];
51
+ changeSetDigestSha256: string;
52
+ affectedActionPathIds: string[];
53
+ status: "READY" | "RUNNING" | "COMPLETED" | "NEEDS_DECISION" | "BLOCKED";
54
+ }>;
55
+ safety: {
56
+ productionWrites: 0;
57
+ rawInputsRetainedByCustomer: true;
58
+ customerHarnessRequired: true;
59
+ policyAuthorityGranted: false;
60
+ };
61
+ limitations: string[];
62
+ }
34
63
  export interface ManagedWorkflowHostedClient {
35
64
  listActiveWorkflows(): Promise<Array<{
36
65
  id: string;
@@ -39,8 +68,10 @@ export interface ManagedWorkflowHostedClient {
39
68
  }>>;
40
69
  getExecutionPlan(workflowId: string): Promise<ManagedWorkflowExecutionPlan>;
41
70
  getTask(taskContractId: string): Promise<TaskEvaluationContract>;
71
+ getAutopilotPlan?(): Promise<ManagedAutopilotDispatchPlan>;
42
72
  upload(report: TaskEvaluationReport, input: {
43
73
  externalId: string;
74
+ autopilot?: ManagedAutopilotDispatchPlan["dispatches"][number];
44
75
  }): Promise<unknown>;
45
76
  }
46
77
  export declare function createManagedWorkflowHostedClient(options: {
@@ -71,6 +102,7 @@ export declare class FileWorkflowEvaluationCheckpointStore implements WorkflowEv
71
102
  }
72
103
  export interface ManagedBusinessWorkflowHarnessResult {
73
104
  workflowsInspected: number;
105
+ autopilotDispatchesInspected: number;
74
106
  evaluationsCompleted: number;
75
107
  evaluationsFailed: number;
76
108
  limitations: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"managed-workflow-harness.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/managed-workflow-harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"managed-workflow-harness.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/managed-workflow-harness.ts"],"names":[],"mappings":"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"}
@@ -32,12 +32,21 @@ export function createManagedWorkflowHostedClient(options) {
32
32
  },
33
33
  getExecutionPlan: async (workflowId) => await hostedJson(requestFetch, `${projectUrl}/business-workflows/${encodeURIComponent(required(workflowId, "workflowId"))}/execution-plan`, apiKey),
34
34
  getTask: async (taskContractId) => await hostedJson(requestFetch, `${projectUrl}/business-tasks/${encodeURIComponent(required(taskContractId, "taskContractId"))}`, apiKey),
35
+ getAutopilotPlan: async () => await hostedJson(requestFetch, `${projectUrl}/nora/autopilot`, apiKey),
35
36
  upload: async (report, input) => await uploadTaskEvaluationReport(report, {
36
37
  baseUrl,
37
38
  projectId,
38
39
  apiKey,
39
40
  externalId: input.externalId,
40
41
  fetch: requestFetch,
42
+ ...(input.autopilot ? { autopilot: {
43
+ dispatchId: input.autopilot.id,
44
+ changeSetDigestSha256: input.autopilot.changeSetDigestSha256,
45
+ candidateAgentVersion: input.autopilot.candidateAgentVersion,
46
+ baselineAgentVersion: input.autopilot.baselineAgentVersion,
47
+ changeIds: input.autopilot.changeIds,
48
+ affectedActionPathIds: input.autopilot.affectedActionPathIds,
49
+ } } : {}),
41
50
  }),
42
51
  };
43
52
  }
@@ -153,7 +162,68 @@ export class ManagedBusinessWorkflowHarness {
153
162
  break;
154
163
  }
155
164
  }
156
- return { workflowsInspected: workflows.length, evaluationsCompleted, evaluationsFailed, limitations };
165
+ const autopilot = this.#client.getAutopilotPlan ? await this.#client.getAutopilotPlan() : {
166
+ schemaVersion: "witnora.nora_assurance_autopilot.v0.1",
167
+ projectId: "legacy-client",
168
+ generatedAt: new Date(0).toISOString(),
169
+ dispatches: [],
170
+ safety: { productionWrites: 0, rawInputsRetainedByCustomer: true, customerHarnessRequired: true, policyAuthorityGranted: false },
171
+ limitations: ["This client does not expose Nora Autopilot dispatches."],
172
+ };
173
+ validateAutopilotPlan(autopilot);
174
+ const readyDispatches = autopilot.dispatches.filter((dispatch) => dispatch.status === "READY");
175
+ const autopilotResults = await mapLimit(readyDispatches, this.#maxConcurrency, async (dispatch) => {
176
+ const evaluation = {
177
+ nodeId: `autopilot:${dispatch.id}`,
178
+ taskContractId: dispatch.taskContractId,
179
+ taskContractDigestSha256: dispatch.taskContractDigestSha256,
180
+ taskKey: dispatch.taskKey,
181
+ agentId: dispatch.agentId,
182
+ agentVersion: dispatch.candidateAgentVersion,
183
+ baselineAgentVersion: dispatch.baselineAgentVersion,
184
+ mode: dispatch.mode,
185
+ };
186
+ const key = `autopilot:${autopilot.projectId}:${dispatch.id}`;
187
+ try {
188
+ const task = await this.#client.getTask(dispatch.taskContractId);
189
+ validateTask(task, evaluation);
190
+ let report = await this.#checkpoints.load(key);
191
+ if (!report) {
192
+ report = await this.#evaluate({ task: structuredClone(task), evaluation: structuredClone(evaluation) });
193
+ validateReport(report, task, evaluation);
194
+ await this.#checkpoints.save(key, report);
195
+ }
196
+ else
197
+ validateReport(report, task, evaluation);
198
+ await this.#client.upload(report, { externalId: `autopilot:${dispatch.id}`, autopilot: dispatch });
199
+ await this.#checkpoints.complete(key);
200
+ return true;
201
+ }
202
+ catch {
203
+ limitations.push(`Autopilot evaluation ${dispatch.taskKey}:${dispatch.mode} failed closed; no policy or release state changed.`);
204
+ return false;
205
+ }
206
+ });
207
+ evaluationsCompleted += autopilotResults.filter(Boolean).length;
208
+ evaluationsFailed += autopilotResults.filter((value) => !value).length;
209
+ return { workflowsInspected: workflows.length, autopilotDispatchesInspected: readyDispatches.length, evaluationsCompleted, evaluationsFailed, limitations };
210
+ }
211
+ }
212
+ function validateAutopilotPlan(plan) {
213
+ if (plan.schemaVersion !== "witnora.nora_assurance_autopilot.v0.1"
214
+ || plan.safety.productionWrites !== 0 || plan.safety.rawInputsRetainedByCustomer !== true
215
+ || plan.safety.customerHarnessRequired !== true || plan.safety.policyAuthorityGranted !== false
216
+ || plan.dispatches.length > 200)
217
+ throw new Error("Managed Workflow Harness rejected an unsafe Nora Autopilot plan.");
218
+ const seen = new Set();
219
+ for (const dispatch of plan.dispatches) {
220
+ if (dispatch.projectId !== plan.projectId || seen.has(dispatch.id) || !/^[a-f0-9]{64}$/.test(dispatch.id)
221
+ || !/^[a-f0-9]{64}$/.test(dispatch.taskContractDigestSha256) || !/^[a-f0-9]{64}$/.test(dispatch.changeSetDigestSha256)
222
+ || (dispatch.mode !== "REPLAY" && dispatch.mode !== "SHADOW") || !dispatch.agentId || !dispatch.baselineAgentVersion || !dispatch.candidateAgentVersion
223
+ || !Array.isArray(dispatch.changeIds) || !dispatch.changeIds.length || !Array.isArray(dispatch.affectedActionPathIds)) {
224
+ throw new Error("Managed Workflow Harness rejected an invalid Nora Autopilot dispatch.");
225
+ }
226
+ seen.add(dispatch.id);
157
227
  }
158
228
  }
159
229
  function validatePlan(plan, workflow) {
@@ -190,7 +260,7 @@ function validateTask(task, evaluation) {
190
260
  || task.digestSha256 !== evaluation.taskContractDigestSha256
191
261
  || task.taskKey !== evaluation.taskKey
192
262
  || task.subject.agentId !== evaluation.agentId
193
- || task.subject.agentVersion !== evaluation.agentVersion) {
263
+ || task.subject.agentVersion !== (evaluation.baselineAgentVersion ?? evaluation.agentVersion)) {
194
264
  throw new Error("Managed Workflow Harness rejected a Business Task that did not match the execution plan.");
195
265
  }
196
266
  }
@@ -5,6 +5,14 @@ export interface TaskEvaluationHostedOptions {
5
5
  apiKey: string;
6
6
  externalId?: string;
7
7
  fetch?: typeof fetch;
8
+ autopilot?: {
9
+ dispatchId: string;
10
+ changeSetDigestSha256: string;
11
+ candidateAgentVersion: string;
12
+ baselineAgentVersion: string;
13
+ changeIds: string[];
14
+ affectedActionPathIds: string[];
15
+ };
8
16
  }
9
17
  export interface TaskEvaluationHostedResult {
10
18
  run: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"task-evaluation-hosted.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/task-evaluation-hosted.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAyDrC;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B1H"}
1
+ {"version":3,"file":"task-evaluation-hosted.d.ts","sourceRoot":"","sources":["../../../../onegent-runtime/src/task-evaluation-hosted.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,qBAAqB,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;CACH;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAuErC;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B1H"}
@@ -26,7 +26,21 @@ export async function uploadTaskEvaluationReport(report, options) {
26
26
  mode: report.mode,
27
27
  writesBlocked: true,
28
28
  rawInputsRetainedByCustomer: true,
29
- } },
29
+ ...(options.autopilot ? {
30
+ schemaVersion: "witnora.task_evaluation_binding.v0.2",
31
+ baselineAgentVersion: options.autopilot.baselineAgentVersion,
32
+ candidateAgentVersion: options.autopilot.candidateAgentVersion,
33
+ } : {}),
34
+ }, ...(options.autopilot ? { noraAutopilot: {
35
+ schemaVersion: "witnora.nora_autopilot_evaluation_binding.v0.1",
36
+ dispatchId: options.autopilot.dispatchId,
37
+ changeSetDigestSha256: options.autopilot.changeSetDigestSha256,
38
+ taskContractId: report.task.id,
39
+ candidateAgentVersion: options.autopilot.candidateAgentVersion,
40
+ mode: report.mode,
41
+ changeIds: [...options.autopilot.changeIds],
42
+ affectedActionPathIds: [...options.autopilot.affectedActionPathIds],
43
+ } } : {}) },
30
44
  }),
31
45
  });
32
46
  if (typeof run.id !== "string" || !run.id)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "witnora",
3
- "version": "0.13.8",
3
+ "version": "0.13.10",
4
4
  "description": "Independent assurance for covered agent action paths across models and frameworks.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -40,6 +40,10 @@
40
40
  "types": "./dist/vendor/onegent-runtime/browser-adapter-kit.d.ts",
41
41
  "import": "./dist/vendor/onegent-runtime/browser-adapter-kit.js"
42
42
  },
43
+ "./evaluator-kit": {
44
+ "types": "./dist/vendor/onegent-runtime/business-task-evaluator.d.ts",
45
+ "import": "./dist/vendor/onegent-runtime/business-task-evaluator.js"
46
+ },
43
47
  "./deployment-enforcement": {
44
48
  "types": "./dist/internal/control-client/deployment-enforcement.d.ts",
45
49
  "import": "./dist/internal/control-client/deployment-enforcement.js"