@tangle-network/agent-runtime 0.1.0 → 0.3.0

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
@@ -55,6 +55,53 @@ If knowledge readiness fails, `runAgentTask` stops before domain actions by
55
55
  default. Adapters can override `onKnowledgeBlocked` to emit a domain action,
56
56
  such as asking a user, querying a connector, or inspecting a repo.
57
57
 
58
+ `runAgentTask` also emits typed lifecycle events through `onEvent`:
59
+
60
+ ```ts
61
+ await runAgentTask({
62
+ task,
63
+ adapter,
64
+ knowledge,
65
+ onEvent(event) {
66
+ console.log(event.type)
67
+ },
68
+ })
69
+ ```
70
+
71
+ Events cover readiness, question answering, acquisition, control-loop steps,
72
+ and task completion. This keeps streaming UI, logs, and telemetry out of domain
73
+ adapters while making every runtime transition observable.
74
+
75
+ For logs, reports, and UI telemetry, do not serialize raw events directly.
76
+ Use the built-in sanitized collector:
77
+
78
+ ```ts
79
+ import { createRuntimeEventCollector, summarizeAgentTaskRun } from '@tangle-network/agent-runtime'
80
+
81
+ const telemetry = createRuntimeEventCollector()
82
+ const result = await runAgentTask({ task, adapter, onEvent: telemetry.onEvent })
83
+
84
+ console.log(telemetry.events)
85
+ console.log(summarizeAgentTaskRun(result))
86
+ ```
87
+
88
+ Sanitized telemetry redacts task inputs, user answers, credential questions,
89
+ control payloads, and evidence IDs by default. Private diagnostics can opt into
90
+ specific fields with `includeInputs`, `includeUserAnswers`,
91
+ `includeControlPayloads`, `includeEvidenceIds`, and
92
+ `includeRequirementDescriptions`. Task metadata and eval details are also
93
+ redacted unless `includeMetadata` or `includeEvalDetails` is set.
94
+
95
+ Knowledge providers may implement:
96
+
97
+ - `buildReadiness`
98
+ - `answerQuestions`
99
+ - `executeAcquisitionPlans`
100
+ - `refreshReadiness`
101
+
102
+ That lets a task collect missing context before the control loop starts, then
103
+ rerun readiness scoring against the new evidence.
104
+
58
105
  ## Package Boundaries
59
106
 
60
107
  - `agent-runtime` owns the reusable lifecycle and adapter contracts.
package/dist/index.d.ts CHANGED
@@ -15,6 +15,12 @@ interface AgentKnowledgeProvider {
15
15
  buildReadiness?(task: AgentTaskSpec): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport;
16
16
  answerQuestions?(questions: UserQuestion[], task: AgentTaskSpec): Promise<Record<string, string>> | Record<string, string>;
17
17
  executeAcquisitionPlans?(plans: DataAcquisitionPlan[], task: AgentTaskSpec): Promise<string[]> | string[];
18
+ refreshReadiness?(input: {
19
+ task: AgentTaskSpec;
20
+ previous: KnowledgeReadinessReport;
21
+ userAnswers: Record<string, string>;
22
+ acquiredEvidenceIds: string[];
23
+ }): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport;
18
24
  }
19
25
  interface AgentTaskContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {
20
26
  task: AgentTaskSpec;
@@ -72,10 +78,59 @@ interface AgentAdapter<TState, TAction, TActionResult, TEval extends ControlEval
72
78
  }): number | undefined;
73
79
  projectRunRecords?(result: ControlRunResult<TState, TAction, TActionResult, TEval>, task: AgentTaskSpec): RunRecord[];
74
80
  }
81
+ type AgentTaskStatus = 'completed' | 'blocked' | 'failed' | 'aborted';
82
+ type AgentRuntimeEvent<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> = {
83
+ type: 'task_start';
84
+ task: AgentTaskSpec;
85
+ } | {
86
+ type: 'readiness_start';
87
+ task: AgentTaskSpec;
88
+ } | {
89
+ type: 'readiness_end';
90
+ task: AgentTaskSpec;
91
+ knowledge: KnowledgeReadinessReport;
92
+ } | {
93
+ type: 'questions_start';
94
+ task: AgentTaskSpec;
95
+ questions: UserQuestion[];
96
+ } | {
97
+ type: 'questions_end';
98
+ task: AgentTaskSpec;
99
+ questions: UserQuestion[];
100
+ userAnswers: Record<string, string>;
101
+ } | {
102
+ type: 'acquisition_start';
103
+ task: AgentTaskSpec;
104
+ acquisitionPlans: DataAcquisitionPlan[];
105
+ } | {
106
+ type: 'acquisition_end';
107
+ task: AgentTaskSpec;
108
+ acquisitionPlans: DataAcquisitionPlan[];
109
+ acquiredEvidenceIds: string[];
110
+ } | {
111
+ type: 'control_start';
112
+ task: AgentTaskSpec;
113
+ knowledge: KnowledgeReadinessReport;
114
+ } | {
115
+ type: 'control_step';
116
+ task: AgentTaskSpec;
117
+ step: ControlStep<TState, TAction, TActionResult, TEval>;
118
+ } | {
119
+ type: 'control_end';
120
+ task: AgentTaskSpec;
121
+ control: ControlRunResult<TState, TAction, TActionResult, TEval>;
122
+ } | {
123
+ type: 'task_end';
124
+ task: AgentTaskSpec;
125
+ status: AgentTaskStatus;
126
+ reason: string;
127
+ };
128
+ type AgentRuntimeEventSink<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> = (event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>) => Promise<void> | void;
75
129
  interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {
76
130
  task: AgentTaskSpec;
77
131
  adapter: AgentAdapter<TState, TAction, TActionResult, TEval>;
78
132
  knowledge?: AgentKnowledgeProvider;
133
+ onEvent?: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>;
79
134
  store?: TraceStore;
80
135
  signal?: AbortSignal;
81
136
  scenarioId?: string;
@@ -85,12 +140,87 @@ interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends Cont
85
140
  }
86
141
  interface AgentTaskRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {
87
142
  task: AgentTaskSpec;
143
+ status: AgentTaskStatus;
88
144
  knowledge: KnowledgeReadinessReport;
89
145
  questions: UserQuestion[];
90
146
  acquisitionPlans: DataAcquisitionPlan[];
147
+ userAnswers: Record<string, string>;
148
+ acquiredEvidenceIds: string[];
91
149
  control: ControlRunResult<TState, TAction, TActionResult, TEval>;
92
150
  runRecords: RunRecord[];
93
151
  }
152
+ interface RuntimeTelemetryOptions {
153
+ /**
154
+ * Include raw task inputs. Off by default because task inputs often
155
+ * contain customer facts, credentials, source text, or internal IDs.
156
+ */
157
+ includeInputs?: boolean;
158
+ /** Include requirement descriptions. Secret requirements are always redacted. */
159
+ includeRequirementDescriptions?: boolean;
160
+ /** Include evidence IDs. Off by default; counts are safer for shared reports. */
161
+ includeEvidenceIds?: boolean;
162
+ /** Include user answers from question preflight. Off by default. */
163
+ includeUserAnswers?: boolean;
164
+ /** Include action payloads and action results for control steps. Off by default. */
165
+ includeControlPayloads?: boolean;
166
+ /** Include task metadata. Off by default because metadata may carry IDs or policy internals. */
167
+ includeMetadata?: boolean;
168
+ /** Include eval detail/evidence strings. Off by default because validators may echo private input. */
169
+ includeEvalDetails?: boolean;
170
+ }
171
+ interface SanitizedKnowledgeRequirement {
172
+ id: string;
173
+ description?: string;
174
+ requiredFor: string[];
175
+ category: KnowledgeRequirement['category'];
176
+ acquisitionMode: KnowledgeRequirement['acquisitionMode'];
177
+ importance: KnowledgeRequirement['importance'];
178
+ freshness: KnowledgeRequirement['freshness'];
179
+ sensitivity: KnowledgeRequirement['sensitivity'];
180
+ confidenceNeeded: number;
181
+ currentConfidence: number;
182
+ evidenceCount: number;
183
+ evidenceIds?: string[];
184
+ fallbackPolicy: KnowledgeRequirement['fallbackPolicy'];
185
+ }
186
+ interface SanitizedKnowledgeReadinessReport {
187
+ taskId: string;
188
+ readinessScore: number;
189
+ recommendedAction: KnowledgeReadinessReport['recommendedAction'];
190
+ severity: KnowledgeReadinessReport['severity'];
191
+ reason: string;
192
+ blockingMissingRequirements: SanitizedKnowledgeRequirement[];
193
+ nonBlockingGaps: SanitizedKnowledgeRequirement[];
194
+ evidenceCount: number;
195
+ evidenceIds?: string[];
196
+ missingRequirementIds: string[];
197
+ }
198
+ interface AgentTaskRunSummary {
199
+ taskId: string;
200
+ domain?: string;
201
+ status: AgentTaskStatus;
202
+ reason: string;
203
+ readinessScore: number;
204
+ recommendedAction: KnowledgeReadinessReport['recommendedAction'];
205
+ blockingGapIds: string[];
206
+ nonBlockingGapIds: string[];
207
+ questionCount: number;
208
+ acquisitionPlanCount: number;
209
+ acquiredEvidenceCount: number;
210
+ controlStepCount: number;
211
+ pass: boolean;
212
+ failureClass?: string;
213
+ wallMs: number;
214
+ costUsd: number;
215
+ }
216
+ interface RuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> {
217
+ onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>;
218
+ events: Array<Record<string, unknown>>;
219
+ }
94
220
  declare function runAgentTask<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(options: RunAgentTaskOptions<TState, TAction, TActionResult, TEval>): Promise<AgentTaskRunResult<TState, TAction, TActionResult, TEval>>;
221
+ declare function summarizeAgentTaskRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(result: AgentTaskRunResult<TState, TAction, TActionResult, TEval>): AgentTaskRunSummary;
222
+ declare function sanitizeKnowledgeReadinessReport(report: KnowledgeReadinessReport, options?: RuntimeTelemetryOptions): SanitizedKnowledgeReadinessReport;
223
+ declare function sanitizeAgentRuntimeEvent<TState, TAction, TActionResult, TEval extends ControlEvalResult>(event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>, options?: RuntimeTelemetryOptions): Record<string, unknown>;
224
+ declare function createRuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult>(options?: RuntimeTelemetryOptions): RuntimeEventCollector<TState, TAction, TActionResult, TEval>;
95
225
 
96
- export { type AgentAdapter, type AgentKnowledgeProvider, type AgentTaskContext, type AgentTaskRunResult, type AgentTaskSpec, type RunAgentTaskOptions, runAgentTask };
226
+ export { type AgentAdapter, type AgentKnowledgeProvider, type AgentRuntimeEvent, type AgentRuntimeEventSink, type AgentTaskContext, type AgentTaskRunResult, type AgentTaskRunSummary, type AgentTaskSpec, type AgentTaskStatus, type RunAgentTaskOptions, type RuntimeEventCollector, type RuntimeTelemetryOptions, type SanitizedKnowledgeReadinessReport, type SanitizedKnowledgeRequirement, createRuntimeEventCollector, runAgentTask, sanitizeAgentRuntimeEvent, sanitizeKnowledgeReadinessReport, summarizeAgentTaskRun };
package/dist/index.js CHANGED
@@ -8,12 +8,27 @@ import {
8
8
  } from "@tangle-network/agent-eval";
9
9
  async function runAgentTask(options) {
10
10
  const task = options.task;
11
- const knowledge = await buildReadiness(task, options.knowledge);
11
+ await emit(options.onEvent, { type: "task_start", task });
12
+ await emit(options.onEvent, { type: "readiness_start", task });
13
+ let knowledge = await buildReadiness(task, options.knowledge);
14
+ await emit(options.onEvent, { type: "readiness_end", task, knowledge });
12
15
  const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements);
13
16
  const acquisitionPlans = acquisitionPlansForKnowledgeGaps([
14
17
  ...knowledge.blockingMissingRequirements,
15
18
  ...knowledge.nonBlockingGaps
16
19
  ]);
20
+ const preflight = await runKnowledgePreflight(task, questions, acquisitionPlans, options.knowledge, options.onEvent);
21
+ if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {
22
+ await emit(options.onEvent, { type: "readiness_start", task });
23
+ knowledge = await options.knowledge.refreshReadiness({
24
+ task,
25
+ previous: knowledge,
26
+ userAnswers: preflight.userAnswers,
27
+ acquiredEvidenceIds: preflight.acquiredEvidenceIds
28
+ });
29
+ await emit(options.onEvent, { type: "readiness_end", task, knowledge });
30
+ }
31
+ await emit(options.onEvent, { type: "control_start", task, knowledge });
17
32
  const control = await runAgentControlLoop({
18
33
  intent: task.intent,
19
34
  budget: task.budget,
@@ -41,17 +56,222 @@ async function runAgentTask(options) {
41
56
  },
42
57
  act: (action, ctx) => options.adapter.act(action, toAgentContext(task, knowledge, ctx)),
43
58
  shouldStop: options.adapter.shouldStop ? (ctx) => options.adapter.shouldStop(toAgentContext(task, knowledge, ctx)) : void 0,
44
- getActionCostUsd: options.adapter.getActionCostUsd ? ({ action, result, state, evals, history }) => options.adapter.getActionCostUsd({ action, result, task, state, evals, history }) : void 0
59
+ getActionCostUsd: options.adapter.getActionCostUsd ? ({ action, result, state, evals, history }) => options.adapter.getActionCostUsd({ action, result, task, state, evals, history }) : void 0,
60
+ onStep: (step) => emit(options.onEvent, { type: "control_step", task, step })
45
61
  });
62
+ await emit(options.onEvent, { type: "control_end", task, control });
63
+ const status = statusFromControl(control);
64
+ await emit(options.onEvent, { type: "task_end", task, status, reason: control.reason });
46
65
  return {
47
66
  task,
67
+ status,
48
68
  knowledge,
49
69
  questions,
50
70
  acquisitionPlans,
71
+ userAnswers: preflight.userAnswers,
72
+ acquiredEvidenceIds: preflight.acquiredEvidenceIds,
51
73
  control,
52
74
  runRecords: options.adapter.projectRunRecords?.(control, task) ?? []
53
75
  };
54
76
  }
77
+ function summarizeAgentTaskRun(result) {
78
+ return {
79
+ taskId: result.task.id,
80
+ domain: result.task.domain,
81
+ status: result.status,
82
+ reason: result.control.reason,
83
+ readinessScore: result.knowledge.readinessScore,
84
+ recommendedAction: result.knowledge.recommendedAction,
85
+ blockingGapIds: result.knowledge.blockingMissingRequirements.map((requirement) => requirement.id),
86
+ nonBlockingGapIds: result.knowledge.nonBlockingGaps.map((requirement) => requirement.id),
87
+ questionCount: result.questions.length,
88
+ acquisitionPlanCount: result.acquisitionPlans.length,
89
+ acquiredEvidenceCount: result.acquiredEvidenceIds.length,
90
+ controlStepCount: result.control.steps.length,
91
+ pass: result.control.pass,
92
+ failureClass: result.control.failureClass,
93
+ wallMs: result.control.wallMs,
94
+ costUsd: result.control.spentCostUsd
95
+ };
96
+ }
97
+ function sanitizeKnowledgeReadinessReport(report, options = {}) {
98
+ return {
99
+ taskId: report.taskId,
100
+ readinessScore: report.readinessScore,
101
+ recommendedAction: report.recommendedAction,
102
+ severity: report.severity,
103
+ reason: report.reason,
104
+ blockingMissingRequirements: report.blockingMissingRequirements.map(
105
+ (requirement) => sanitizeKnowledgeRequirement(requirement, options)
106
+ ),
107
+ nonBlockingGaps: report.nonBlockingGaps.map(
108
+ (requirement) => sanitizeKnowledgeRequirement(requirement, options)
109
+ ),
110
+ evidenceCount: report.bundle.evidenceIds.length,
111
+ evidenceIds: options.includeEvidenceIds ? report.bundle.evidenceIds : void 0,
112
+ missingRequirementIds: report.bundle.missing.map((requirement) => requirement.id)
113
+ };
114
+ }
115
+ function sanitizeAgentRuntimeEvent(event, options = {}) {
116
+ const base = { type: event.type, task: sanitizeTask(event.task, options) };
117
+ if (event.type === "readiness_start" || event.type === "task_start" || event.type === "control_start") {
118
+ return event.type === "control_start" ? { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) } : base;
119
+ }
120
+ if (event.type === "readiness_end") {
121
+ return { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) };
122
+ }
123
+ if (event.type === "questions_start") {
124
+ return { ...base, questions: event.questions.map((question) => sanitizeQuestion(question, options)) };
125
+ }
126
+ if (event.type === "questions_end") {
127
+ return {
128
+ ...base,
129
+ questions: event.questions.map((question) => sanitizeQuestion(question, options)),
130
+ userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers)
131
+ };
132
+ }
133
+ if (event.type === "acquisition_start") {
134
+ return { ...base, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) };
135
+ }
136
+ if (event.type === "acquisition_end") {
137
+ return {
138
+ ...base,
139
+ acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),
140
+ acquiredEvidenceCount: event.acquiredEvidenceIds.length,
141
+ acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : void 0
142
+ };
143
+ }
144
+ if (event.type === "control_step") {
145
+ return { ...base, step: sanitizeControlStep(event.step, options) };
146
+ }
147
+ if (event.type === "control_end") {
148
+ return { ...base, control: sanitizeControlRun(event.control, options) };
149
+ }
150
+ return { ...base, status: event.status, reason: event.reason };
151
+ }
152
+ function createRuntimeEventCollector(options = {}) {
153
+ const events = [];
154
+ return {
155
+ events,
156
+ onEvent: (event) => {
157
+ events.push(sanitizeAgentRuntimeEvent(event, options));
158
+ }
159
+ };
160
+ }
161
+ async function runKnowledgePreflight(task, questions, acquisitionPlans, provider, onEvent) {
162
+ let userAnswers = {};
163
+ let acquiredEvidenceIds = [];
164
+ if (questions.length > 0 && provider?.answerQuestions) {
165
+ await emit(onEvent, { type: "questions_start", task, questions });
166
+ userAnswers = await provider.answerQuestions(questions, task);
167
+ await emit(onEvent, { type: "questions_end", task, questions, userAnswers });
168
+ }
169
+ if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {
170
+ await emit(onEvent, { type: "acquisition_start", task, acquisitionPlans });
171
+ acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task);
172
+ await emit(onEvent, { type: "acquisition_end", task, acquisitionPlans, acquiredEvidenceIds });
173
+ }
174
+ return { userAnswers, acquiredEvidenceIds };
175
+ }
176
+ function sanitizeTask(task, options) {
177
+ return {
178
+ id: task.id,
179
+ intent: task.intent,
180
+ domain: task.domain,
181
+ inputs: options.includeInputs ? task.inputs : task.inputs ? "[redacted]" : void 0,
182
+ requiredKnowledge: task.requiredKnowledge?.map(
183
+ (requirement) => sanitizeKnowledgeRequirement(requirement, options)
184
+ ),
185
+ metadata: options.includeMetadata ? task.metadata : task.metadata ? "[redacted]" : void 0
186
+ };
187
+ }
188
+ function sanitizeKnowledgeRequirement(requirement, options) {
189
+ const includeDescription = options.includeRequirementDescriptions && requirement.sensitivity !== "secret";
190
+ return {
191
+ id: requirement.id,
192
+ description: includeDescription ? requirement.description : void 0,
193
+ requiredFor: requirement.requiredFor,
194
+ category: requirement.category,
195
+ acquisitionMode: requirement.acquisitionMode,
196
+ importance: requirement.importance,
197
+ freshness: requirement.freshness,
198
+ sensitivity: requirement.sensitivity,
199
+ confidenceNeeded: requirement.confidenceNeeded,
200
+ currentConfidence: requirement.currentConfidence,
201
+ evidenceCount: requirement.evidenceIds.length,
202
+ evidenceIds: options.includeEvidenceIds ? requirement.evidenceIds : void 0,
203
+ fallbackPolicy: requirement.fallbackPolicy
204
+ };
205
+ }
206
+ function sanitizeQuestion(question, options) {
207
+ return {
208
+ id: question.id,
209
+ question: options.includeRequirementDescriptions && question.answerType !== "credential" ? question.question : void 0,
210
+ reason: options.includeRequirementDescriptions ? question.reason : void 0,
211
+ requirementId: question.requirementId,
212
+ importance: question.importance,
213
+ answerType: question.answerType,
214
+ impactIfUnknown: options.includeRequirementDescriptions ? question.impactIfUnknown : void 0,
215
+ optionCount: question.options?.length ?? 0
216
+ };
217
+ }
218
+ function sanitizeAcquisitionPlan(plan) {
219
+ return {
220
+ id: plan.id,
221
+ requirementIds: plan.requirementIds,
222
+ mode: plan.mode,
223
+ priority: plan.priority,
224
+ expectedEvidenceCount: plan.expectedEvidenceIds?.length ?? 0,
225
+ questionCount: plan.questions?.length ?? 0
226
+ };
227
+ }
228
+ function sanitizeControlStep(step, options) {
229
+ const actionOutcome = step.actionOutcome;
230
+ return {
231
+ index: step.index,
232
+ decisionType: step.decision.type,
233
+ reason: step.decision.reason,
234
+ action: options.includeControlPayloads && step.decision.type === "continue" ? step.decision.action : void 0,
235
+ result: options.includeControlPayloads && actionOutcome?.ok ? actionOutcome.result : void 0,
236
+ actionOk: actionOutcome?.ok,
237
+ actionError: actionOutcome?.ok === false ? actionOutcome.error : void 0,
238
+ durationMs: actionOutcome?.durationMs,
239
+ evalsBefore: summarizeEvals(step.evalsBefore, options),
240
+ evalsAfter: summarizeEvals(step.evalsAfter, options),
241
+ startedAt: step.startedAt,
242
+ endedAt: step.endedAt
243
+ };
244
+ }
245
+ function sanitizeControlRun(control, options) {
246
+ return {
247
+ pass: control.pass,
248
+ completed: control.completed,
249
+ reason: control.reason,
250
+ score: control.score,
251
+ stepCount: control.steps.length,
252
+ wallMs: control.wallMs,
253
+ spentCostUsd: control.spentCostUsd,
254
+ failureClass: control.failureClass,
255
+ stoppedBy: control.stoppedBy,
256
+ runId: control.runId,
257
+ runtimeErrorCount: control.runtimeErrors.length,
258
+ finalEvals: summarizeEvals(control.finalEvals, options)
259
+ };
260
+ }
261
+ function summarizeEvals(evals, options) {
262
+ return evals.map((evalResult) => ({
263
+ id: evalResult.id,
264
+ passed: evalResult.passed,
265
+ score: evalResult.score,
266
+ severity: evalResult.severity,
267
+ objective: evalResult.objective,
268
+ detail: options.includeEvalDetails ? evalResult.detail : void 0,
269
+ evidence: options.includeEvalDetails ? evalResult.evidence : void 0
270
+ }));
271
+ }
272
+ function redactRecord(record) {
273
+ return Object.fromEntries(Object.keys(record).map((key) => [key, "[redacted]"]));
274
+ }
55
275
  function buildReadiness(task, provider) {
56
276
  if (provider?.buildReadiness) return provider.buildReadiness(task);
57
277
  return scoreKnowledgeReadiness({
@@ -63,6 +283,15 @@ function buildReadiness(task, provider) {
63
283
  function isKnowledgeBlocked(evals) {
64
284
  return evals.some((evalResult) => evalResult.id === "knowledge-ready" && !evalResult.passed);
65
285
  }
286
+ function statusFromControl(control) {
287
+ if (control.stoppedBy === "abort") return "aborted";
288
+ if (control.reason.includes("knowledge readiness blocked")) return "blocked";
289
+ if (control.pass) return "completed";
290
+ return "failed";
291
+ }
292
+ async function emit(sink, event) {
293
+ await sink?.(event);
294
+ }
66
295
  function toAgentContext(task, knowledge, ctx) {
67
296
  return {
68
297
  task,
@@ -79,6 +308,10 @@ function toAgentContext(task, knowledge, ctx) {
79
308
  };
80
309
  }
81
310
  export {
82
- runAgentTask
311
+ createRuntimeEventCollector,
312
+ runAgentTask,
313
+ sanitizeAgentRuntimeEvent,
314
+ sanitizeKnowledgeReadinessReport,
315
+ summarizeAgentTaskRun
83
316
  };
84
317
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n userQuestionsForKnowledgeGaps,\n type ControlBudget,\n type ControlContext,\n type ControlDecision,\n type ControlEvalResult,\n type ControlRunResult,\n type ControlStep,\n type DataAcquisitionPlan,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type RunRecord,\n type TraceStore,\n type UserQuestion,\n} from '@tangle-network/agent-eval'\n\nexport interface AgentTaskSpec {\n id: string\n intent: string\n /** Domain is metadata, not an architectural boundary: tax, legal, gtm, creative, blueprint, redteam, etc. */\n domain?: string\n inputs?: Record<string, unknown>\n requiredKnowledge?: KnowledgeRequirement[]\n budget?: Partial<ControlBudget>\n metadata?: Record<string, unknown>\n}\n\nexport interface AgentKnowledgeProvider {\n buildReadiness?(task: AgentTaskSpec): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n answerQuestions?(questions: UserQuestion[], task: AgentTaskSpec): Promise<Record<string, string>> | Record<string, string>\n executeAcquisitionPlans?(plans: DataAcquisitionPlan[], task: AgentTaskSpec): Promise<string[]> | string[]\n}\n\nexport interface AgentTaskContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n budget: ControlBudget\n stepIndex: number\n wallMs: number\n spentCostUsd: number\n remainingCostUsd?: number\n abortSignal: AbortSignal\n}\n\nexport interface AgentAdapter<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n observe(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TState> | TState\n\n validate(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TEval[]> | TEval[]\n\n decide(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n act(action: TAction, ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<TActionResult> | TActionResult\n\n shouldStop?(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<{\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }> | {\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }\n\n onKnowledgeBlocked?(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n }): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n getActionCostUsd?(ctx: {\n action: TAction\n result: TActionResult\n task: AgentTaskSpec\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n }): number | undefined\n\n projectRunRecords?(result: ControlRunResult<TState, TAction, TActionResult, TEval>, task: AgentTaskSpec): RunRecord[]\n}\n\nexport interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n adapter: AgentAdapter<TState, TAction, TActionResult, TEval>\n knowledge?: AgentKnowledgeProvider\n store?: TraceStore\n signal?: AbortSignal\n scenarioId?: string\n projectId?: string\n variantId?: string\n minimumReadinessScore?: number\n}\n\nexport interface AgentTaskRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n control: ControlRunResult<TState, TAction, TActionResult, TEval>\n runRecords: RunRecord[]\n}\n\nexport async function runAgentTask<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\n options: RunAgentTaskOptions<TState, TAction, TActionResult, TEval>,\n): Promise<AgentTaskRunResult<TState, TAction, TActionResult, TEval>> {\n const task = options.task\n const knowledge = await buildReadiness(task, options.knowledge)\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n\n const control = await runAgentControlLoop<TState, TAction, TActionResult, TEval>({\n intent: task.intent,\n budget: task.budget,\n signal: options.signal,\n store: options.store,\n scenarioId: options.scenarioId ?? task.id,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) => options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, { minimumScore: options.minimumReadinessScore })\n const evals = await options.adapter.validate({ task, knowledge, state, history, abortSignal })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return options.adapter.onKnowledgeBlocked?.({ task, knowledge, questions, acquisitionPlans }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\n }\n }\n return options.adapter.decide(toAgentContext(task, knowledge, ctx))\n },\n act: (action, ctx) => options.adapter.act(action, toAgentContext(task, knowledge, ctx)),\n shouldStop: options.adapter.shouldStop\n ? (ctx) => options.adapter.shouldStop!(toAgentContext(task, knowledge, ctx))\n : undefined,\n getActionCostUsd: options.adapter.getActionCostUsd\n ? ({ action, result, state, evals, history }) => options.adapter.getActionCostUsd!({ action, result, task, state, evals, history })\n : undefined,\n })\n\n return {\n task,\n knowledge,\n questions,\n acquisitionPlans,\n control,\n runRecords: options.adapter.projectRunRecords?.(control, task) ?? [],\n }\n}\n\nfunction buildReadiness(\n task: AgentTaskSpec,\n provider: AgentKnowledgeProvider | undefined,\n): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport {\n if (provider?.buildReadiness) return provider.buildReadiness(task)\n return scoreKnowledgeReadiness({\n taskId: task.id,\n requirements: task.requiredKnowledge ?? [],\n metadata: { domain: task.domain, ...task.metadata },\n })\n}\n\nfunction isKnowledgeBlocked(evals: ControlEvalResult[]): boolean {\n return evals.some((evalResult) => evalResult.id === 'knowledge-ready' && !evalResult.passed)\n}\n\nfunction toAgentContext<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n task: AgentTaskSpec,\n knowledge: KnowledgeReadinessReport,\n ctx: ControlContext<TState, TAction, TActionResult, TEval>,\n): AgentTaskContext<TState, TAction, TActionResult, TEval> {\n return {\n task,\n knowledge,\n state: ctx.state,\n evals: ctx.evals,\n history: ctx.history,\n budget: ctx.budget,\n stepIndex: ctx.stepIndex,\n wallMs: ctx.wallMs,\n spentCostUsd: ctx.spentCostUsd,\n remainingCostUsd: ctx.remainingCostUsd,\n abortSignal: ctx.abortSignal,\n }\n}\n\nexport type {\n ControlBudget,\n ControlDecision,\n ControlEvalResult,\n ControlRunResult,\n ControlStep,\n DataAcquisitionPlan,\n KnowledgeReadinessReport,\n KnowledgeRequirement,\n RunRecord,\n UserQuestion,\n} from '@tangle-network/agent-eval'\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n acquisitionPlansForKnowledgeGaps,\n blockingKnowledgeEval,\n runAgentControlLoop,\n scoreKnowledgeReadiness,\n userQuestionsForKnowledgeGaps,\n type ControlBudget,\n type ControlContext,\n type ControlDecision,\n type ControlEvalResult,\n type ControlRunResult,\n type ControlStep,\n type DataAcquisitionPlan,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type RunRecord,\n type TraceStore,\n type UserQuestion,\n} from '@tangle-network/agent-eval'\n\nexport interface AgentTaskSpec {\n id: string\n intent: string\n /** Domain is metadata, not an architectural boundary: tax, legal, gtm, creative, blueprint, redteam, etc. */\n domain?: string\n inputs?: Record<string, unknown>\n requiredKnowledge?: KnowledgeRequirement[]\n budget?: Partial<ControlBudget>\n metadata?: Record<string, unknown>\n}\n\nexport interface AgentKnowledgeProvider {\n buildReadiness?(task: AgentTaskSpec): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n answerQuestions?(questions: UserQuestion[], task: AgentTaskSpec): Promise<Record<string, string>> | Record<string, string>\n executeAcquisitionPlans?(plans: DataAcquisitionPlan[], task: AgentTaskSpec): Promise<string[]> | string[]\n refreshReadiness?(input: {\n task: AgentTaskSpec\n previous: KnowledgeReadinessReport\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n }): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport\n}\n\nexport interface AgentTaskContext<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n budget: ControlBudget\n stepIndex: number\n wallMs: number\n spentCostUsd: number\n remainingCostUsd?: number\n abortSignal: AbortSignal\n}\n\nexport interface AgentAdapter<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n observe(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TState> | TState\n\n validate(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n state: TState\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n abortSignal: AbortSignal\n }): Promise<TEval[]> | TEval[]\n\n decide(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n act(action: TAction, ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<TActionResult> | TActionResult\n\n shouldStop?(ctx: AgentTaskContext<TState, TAction, TActionResult, TEval>): Promise<{\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }> | {\n stop: boolean\n pass: boolean\n reason: string\n score?: number\n }\n\n onKnowledgeBlocked?(ctx: {\n task: AgentTaskSpec\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n }): Promise<ControlDecision<TAction>> | ControlDecision<TAction>\n\n getActionCostUsd?(ctx: {\n action: TAction\n result: TActionResult\n task: AgentTaskSpec\n state: TState\n evals: TEval[]\n history: ControlStep<TState, TAction, TActionResult, TEval>[]\n }): number | undefined\n\n projectRunRecords?(result: ControlRunResult<TState, TAction, TActionResult, TEval>, task: AgentTaskSpec): RunRecord[]\n}\n\nexport type AgentTaskStatus =\n | 'completed'\n | 'blocked'\n | 'failed'\n | 'aborted'\n\nexport type AgentRuntimeEvent<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> =\n | { type: 'task_start'; task: AgentTaskSpec }\n | { type: 'readiness_start'; task: AgentTaskSpec }\n | { type: 'readiness_end'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'questions_start'; task: AgentTaskSpec; questions: UserQuestion[] }\n | { type: 'questions_end'; task: AgentTaskSpec; questions: UserQuestion[]; userAnswers: Record<string, string> }\n | { type: 'acquisition_start'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[] }\n | { type: 'acquisition_end'; task: AgentTaskSpec; acquisitionPlans: DataAcquisitionPlan[]; acquiredEvidenceIds: string[] }\n | { type: 'control_start'; task: AgentTaskSpec; knowledge: KnowledgeReadinessReport }\n | { type: 'control_step'; task: AgentTaskSpec; step: ControlStep<TState, TAction, TActionResult, TEval> }\n | { type: 'control_end'; task: AgentTaskSpec; control: ControlRunResult<TState, TAction, TActionResult, TEval> }\n | { type: 'task_end'; task: AgentTaskSpec; status: AgentTaskStatus; reason: string }\n\nexport type AgentRuntimeEventSink<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> = (\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n) => Promise<void> | void\n\nexport interface RunAgentTaskOptions<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n adapter: AgentAdapter<TState, TAction, TActionResult, TEval>\n knowledge?: AgentKnowledgeProvider\n onEvent?: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n store?: TraceStore\n signal?: AbortSignal\n scenarioId?: string\n projectId?: string\n variantId?: string\n minimumReadinessScore?: number\n}\n\nexport interface AgentTaskRunResult<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult> {\n task: AgentTaskSpec\n status: AgentTaskStatus\n knowledge: KnowledgeReadinessReport\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n userAnswers: Record<string, string>\n acquiredEvidenceIds: string[]\n control: ControlRunResult<TState, TAction, TActionResult, TEval>\n runRecords: RunRecord[]\n}\n\nexport interface RuntimeTelemetryOptions {\n /**\n * Include raw task inputs. Off by default because task inputs often\n * contain customer facts, credentials, source text, or internal IDs.\n */\n includeInputs?: boolean\n /** Include requirement descriptions. Secret requirements are always redacted. */\n includeRequirementDescriptions?: boolean\n /** Include evidence IDs. Off by default; counts are safer for shared reports. */\n includeEvidenceIds?: boolean\n /** Include user answers from question preflight. Off by default. */\n includeUserAnswers?: boolean\n /** Include action payloads and action results for control steps. Off by default. */\n includeControlPayloads?: boolean\n /** Include task metadata. Off by default because metadata may carry IDs or policy internals. */\n includeMetadata?: boolean\n /** Include eval detail/evidence strings. Off by default because validators may echo private input. */\n includeEvalDetails?: boolean\n}\n\nexport interface SanitizedKnowledgeRequirement {\n id: string\n description?: string\n requiredFor: string[]\n category: KnowledgeRequirement['category']\n acquisitionMode: KnowledgeRequirement['acquisitionMode']\n importance: KnowledgeRequirement['importance']\n freshness: KnowledgeRequirement['freshness']\n sensitivity: KnowledgeRequirement['sensitivity']\n confidenceNeeded: number\n currentConfidence: number\n evidenceCount: number\n evidenceIds?: string[]\n fallbackPolicy: KnowledgeRequirement['fallbackPolicy']\n}\n\nexport interface SanitizedKnowledgeReadinessReport {\n taskId: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n severity: KnowledgeReadinessReport['severity']\n reason: string\n blockingMissingRequirements: SanitizedKnowledgeRequirement[]\n nonBlockingGaps: SanitizedKnowledgeRequirement[]\n evidenceCount: number\n evidenceIds?: string[]\n missingRequirementIds: string[]\n}\n\nexport interface AgentTaskRunSummary {\n taskId: string\n domain?: string\n status: AgentTaskStatus\n reason: string\n readinessScore: number\n recommendedAction: KnowledgeReadinessReport['recommendedAction']\n blockingGapIds: string[]\n nonBlockingGapIds: string[]\n questionCount: number\n acquisitionPlanCount: number\n acquiredEvidenceCount: number\n controlStepCount: number\n pass: boolean\n failureClass?: string\n wallMs: number\n costUsd: number\n}\n\nexport interface RuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult> {\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval>\n events: Array<Record<string, unknown>>\n}\n\nexport async function runAgentTask<TState, TAction, TActionResult, TEval extends ControlEvalResult = ControlEvalResult>(\n options: RunAgentTaskOptions<TState, TAction, TActionResult, TEval>,\n): Promise<AgentTaskRunResult<TState, TAction, TActionResult, TEval>> {\n const task = options.task\n await emit(options.onEvent, { type: 'task_start', task })\n await emit(options.onEvent, { type: 'readiness_start', task })\n let knowledge = await buildReadiness(task, options.knowledge)\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n const questions = userQuestionsForKnowledgeGaps(knowledge.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...knowledge.blockingMissingRequirements,\n ...knowledge.nonBlockingGaps,\n ])\n const preflight = await runKnowledgePreflight(task, questions, acquisitionPlans, options.knowledge, options.onEvent)\n if (options.knowledge?.refreshReadiness && (Object.keys(preflight.userAnswers).length > 0 || preflight.acquiredEvidenceIds.length > 0)) {\n await emit(options.onEvent, { type: 'readiness_start', task })\n knowledge = await options.knowledge.refreshReadiness({\n task,\n previous: knowledge,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n })\n await emit(options.onEvent, { type: 'readiness_end', task, knowledge })\n }\n\n await emit(options.onEvent, { type: 'control_start', task, knowledge })\n const control = await runAgentControlLoop<TState, TAction, TActionResult, TEval>({\n intent: task.intent,\n budget: task.budget,\n signal: options.signal,\n store: options.store,\n scenarioId: options.scenarioId ?? task.id,\n projectId: options.projectId,\n variantId: options.variantId,\n observe: ({ history, abortSignal }) => options.adapter.observe({ task, knowledge, history, abortSignal }),\n validate: async ({ state, history, abortSignal }) => {\n const readinessEval = blockingKnowledgeEval(knowledge, { minimumScore: options.minimumReadinessScore })\n const evals = await options.adapter.validate({ task, knowledge, state, history, abortSignal })\n return [readinessEval as TEval, ...evals]\n },\n decide: (ctx) => {\n if (isKnowledgeBlocked(ctx.evals)) {\n return options.adapter.onKnowledgeBlocked?.({ task, knowledge, questions, acquisitionPlans }) ?? {\n type: 'stop',\n pass: false,\n score: knowledge.readinessScore,\n reason: `knowledge readiness blocked: ${knowledge.reason}`,\n }\n }\n return options.adapter.decide(toAgentContext(task, knowledge, ctx))\n },\n act: (action, ctx) => options.adapter.act(action, toAgentContext(task, knowledge, ctx)),\n shouldStop: options.adapter.shouldStop\n ? (ctx) => options.adapter.shouldStop!(toAgentContext(task, knowledge, ctx))\n : undefined,\n getActionCostUsd: options.adapter.getActionCostUsd\n ? ({ action, result, state, evals, history }) => options.adapter.getActionCostUsd!({ action, result, task, state, evals, history })\n : undefined,\n onStep: (step) => emit(options.onEvent, { type: 'control_step', task, step }),\n })\n await emit(options.onEvent, { type: 'control_end', task, control })\n const status = statusFromControl(control)\n await emit(options.onEvent, { type: 'task_end', task, status, reason: control.reason })\n\n return {\n task,\n status,\n knowledge,\n questions,\n acquisitionPlans,\n userAnswers: preflight.userAnswers,\n acquiredEvidenceIds: preflight.acquiredEvidenceIds,\n control,\n runRecords: options.adapter.projectRunRecords?.(control, task) ?? [],\n }\n}\n\nexport function summarizeAgentTaskRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n result: AgentTaskRunResult<TState, TAction, TActionResult, TEval>,\n): AgentTaskRunSummary {\n return {\n taskId: result.task.id,\n domain: result.task.domain,\n status: result.status,\n reason: result.control.reason,\n readinessScore: result.knowledge.readinessScore,\n recommendedAction: result.knowledge.recommendedAction,\n blockingGapIds: result.knowledge.blockingMissingRequirements.map((requirement) => requirement.id),\n nonBlockingGapIds: result.knowledge.nonBlockingGaps.map((requirement) => requirement.id),\n questionCount: result.questions.length,\n acquisitionPlanCount: result.acquisitionPlans.length,\n acquiredEvidenceCount: result.acquiredEvidenceIds.length,\n controlStepCount: result.control.steps.length,\n pass: result.control.pass,\n failureClass: result.control.failureClass,\n wallMs: result.control.wallMs,\n costUsd: result.control.spentCostUsd,\n }\n}\n\nexport function sanitizeKnowledgeReadinessReport(\n report: KnowledgeReadinessReport,\n options: RuntimeTelemetryOptions = {},\n): SanitizedKnowledgeReadinessReport {\n return {\n taskId: report.taskId,\n readinessScore: report.readinessScore,\n recommendedAction: report.recommendedAction,\n severity: report.severity,\n reason: report.reason,\n blockingMissingRequirements: report.blockingMissingRequirements.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n nonBlockingGaps: report.nonBlockingGaps.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n evidenceCount: report.bundle.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? report.bundle.evidenceIds : undefined,\n missingRequirementIds: report.bundle.missing.map((requirement) => requirement.id),\n }\n}\n\nexport function sanitizeAgentRuntimeEvent<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions = {},\n): Record<string, unknown> {\n const base = { type: event.type, task: sanitizeTask(event.task, options) }\n if (event.type === 'readiness_start' || event.type === 'task_start' || event.type === 'control_start') {\n return event.type === 'control_start'\n ? { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n : base\n }\n if (event.type === 'readiness_end') {\n return { ...base, knowledge: sanitizeKnowledgeReadinessReport(event.knowledge, options) }\n }\n if (event.type === 'questions_start') {\n return { ...base, questions: event.questions.map((question) => sanitizeQuestion(question, options)) }\n }\n if (event.type === 'questions_end') {\n return {\n ...base,\n questions: event.questions.map((question) => sanitizeQuestion(question, options)),\n userAnswers: options.includeUserAnswers ? event.userAnswers : redactRecord(event.userAnswers),\n }\n }\n if (event.type === 'acquisition_start') {\n return { ...base, acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan) }\n }\n if (event.type === 'acquisition_end') {\n return {\n ...base,\n acquisitionPlans: event.acquisitionPlans.map(sanitizeAcquisitionPlan),\n acquiredEvidenceCount: event.acquiredEvidenceIds.length,\n acquiredEvidenceIds: options.includeEvidenceIds ? event.acquiredEvidenceIds : undefined,\n }\n }\n if (event.type === 'control_step') {\n return { ...base, step: sanitizeControlStep(event.step, options) }\n }\n if (event.type === 'control_end') {\n return { ...base, control: sanitizeControlRun(event.control, options) }\n }\n return { ...base, status: event.status, reason: event.reason }\n}\n\nexport function createRuntimeEventCollector<TState = unknown, TAction = unknown, TActionResult = unknown, TEval extends ControlEvalResult = ControlEvalResult>(\n options: RuntimeTelemetryOptions = {},\n): RuntimeEventCollector<TState, TAction, TActionResult, TEval> {\n const events: Array<Record<string, unknown>> = []\n return {\n events,\n onEvent: (event) => {\n events.push(sanitizeAgentRuntimeEvent(event, options))\n },\n }\n}\n\nasync function runKnowledgePreflight<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n task: AgentTaskSpec,\n questions: UserQuestion[],\n acquisitionPlans: DataAcquisitionPlan[],\n provider: AgentKnowledgeProvider | undefined,\n onEvent: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n): Promise<{ userAnswers: Record<string, string>; acquiredEvidenceIds: string[] }> {\n let userAnswers: Record<string, string> = {}\n let acquiredEvidenceIds: string[] = []\n if (questions.length > 0 && provider?.answerQuestions) {\n await emit(onEvent, { type: 'questions_start', task, questions })\n userAnswers = await provider.answerQuestions(questions, task)\n await emit(onEvent, { type: 'questions_end', task, questions, userAnswers })\n }\n if (acquisitionPlans.length > 0 && provider?.executeAcquisitionPlans) {\n await emit(onEvent, { type: 'acquisition_start', task, acquisitionPlans })\n acquiredEvidenceIds = await provider.executeAcquisitionPlans(acquisitionPlans, task)\n await emit(onEvent, { type: 'acquisition_end', task, acquisitionPlans, acquiredEvidenceIds })\n }\n return { userAnswers, acquiredEvidenceIds }\n}\n\nfunction sanitizeTask(task: AgentTaskSpec, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: task.id,\n intent: task.intent,\n domain: task.domain,\n inputs: options.includeInputs ? task.inputs : task.inputs ? '[redacted]' : undefined,\n requiredKnowledge: task.requiredKnowledge?.map((requirement) =>\n sanitizeKnowledgeRequirement(requirement, options),\n ),\n metadata: options.includeMetadata ? task.metadata : task.metadata ? '[redacted]' : undefined,\n }\n}\n\nfunction sanitizeKnowledgeRequirement(\n requirement: KnowledgeRequirement,\n options: RuntimeTelemetryOptions,\n): SanitizedKnowledgeRequirement {\n const includeDescription = options.includeRequirementDescriptions && requirement.sensitivity !== 'secret'\n return {\n id: requirement.id,\n description: includeDescription ? requirement.description : undefined,\n requiredFor: requirement.requiredFor,\n category: requirement.category,\n acquisitionMode: requirement.acquisitionMode,\n importance: requirement.importance,\n freshness: requirement.freshness,\n sensitivity: requirement.sensitivity,\n confidenceNeeded: requirement.confidenceNeeded,\n currentConfidence: requirement.currentConfidence,\n evidenceCount: requirement.evidenceIds.length,\n evidenceIds: options.includeEvidenceIds ? requirement.evidenceIds : undefined,\n fallbackPolicy: requirement.fallbackPolicy,\n }\n}\n\nfunction sanitizeQuestion(question: UserQuestion, options: RuntimeTelemetryOptions): Record<string, unknown> {\n return {\n id: question.id,\n question: options.includeRequirementDescriptions && question.answerType !== 'credential'\n ? question.question\n : undefined,\n reason: options.includeRequirementDescriptions ? question.reason : undefined,\n requirementId: question.requirementId,\n importance: question.importance,\n answerType: question.answerType,\n impactIfUnknown: options.includeRequirementDescriptions ? question.impactIfUnknown : undefined,\n optionCount: question.options?.length ?? 0,\n }\n}\n\nfunction sanitizeAcquisitionPlan(plan: DataAcquisitionPlan): Record<string, unknown> {\n return {\n id: plan.id,\n requirementIds: plan.requirementIds,\n mode: plan.mode,\n priority: plan.priority,\n expectedEvidenceCount: plan.expectedEvidenceIds?.length ?? 0,\n questionCount: plan.questions?.length ?? 0,\n }\n}\n\nfunction sanitizeControlStep<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n step: ControlStep<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n const actionOutcome = step.actionOutcome\n return {\n index: step.index,\n decisionType: step.decision.type,\n reason: step.decision.reason,\n action: options.includeControlPayloads && step.decision.type === 'continue' ? step.decision.action : undefined,\n result: options.includeControlPayloads && actionOutcome?.ok ? actionOutcome.result : undefined,\n actionOk: actionOutcome?.ok,\n actionError: actionOutcome?.ok === false ? actionOutcome.error : undefined,\n durationMs: actionOutcome?.durationMs,\n evalsBefore: summarizeEvals(step.evalsBefore, options),\n evalsAfter: summarizeEvals(step.evalsAfter, options),\n startedAt: step.startedAt,\n endedAt: step.endedAt,\n }\n}\n\nfunction sanitizeControlRun<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n control: ControlRunResult<TState, TAction, TActionResult, TEval>,\n options: RuntimeTelemetryOptions,\n): Record<string, unknown> {\n return {\n pass: control.pass,\n completed: control.completed,\n reason: control.reason,\n score: control.score,\n stepCount: control.steps.length,\n wallMs: control.wallMs,\n spentCostUsd: control.spentCostUsd,\n failureClass: control.failureClass,\n stoppedBy: control.stoppedBy,\n runId: control.runId,\n runtimeErrorCount: control.runtimeErrors.length,\n finalEvals: summarizeEvals(control.finalEvals, options),\n }\n}\n\nfunction summarizeEvals(evals: ControlEvalResult[], options: RuntimeTelemetryOptions): Array<Record<string, unknown>> {\n return evals.map((evalResult) => ({\n id: evalResult.id,\n passed: evalResult.passed,\n score: evalResult.score,\n severity: evalResult.severity,\n objective: evalResult.objective,\n detail: options.includeEvalDetails ? evalResult.detail : undefined,\n evidence: options.includeEvalDetails ? evalResult.evidence : undefined,\n }))\n}\n\nfunction redactRecord(record: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.keys(record).map((key) => [key, '[redacted]']))\n}\n\nfunction buildReadiness(\n task: AgentTaskSpec,\n provider: AgentKnowledgeProvider | undefined,\n): Promise<KnowledgeReadinessReport> | KnowledgeReadinessReport {\n if (provider?.buildReadiness) return provider.buildReadiness(task)\n return scoreKnowledgeReadiness({\n taskId: task.id,\n requirements: task.requiredKnowledge ?? [],\n metadata: { domain: task.domain, ...task.metadata },\n })\n}\n\nfunction isKnowledgeBlocked(evals: ControlEvalResult[]): boolean {\n return evals.some((evalResult) => evalResult.id === 'knowledge-ready' && !evalResult.passed)\n}\n\nfunction statusFromControl(control: ControlRunResult<unknown, unknown, unknown, ControlEvalResult>): AgentTaskStatus {\n if (control.stoppedBy === 'abort') return 'aborted'\n if (control.reason.includes('knowledge readiness blocked')) return 'blocked'\n if (control.pass) return 'completed'\n return 'failed'\n}\n\nasync function emit<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n sink: AgentRuntimeEventSink<TState, TAction, TActionResult, TEval> | undefined,\n event: AgentRuntimeEvent<TState, TAction, TActionResult, TEval>,\n): Promise<void> {\n await sink?.(event)\n}\n\nfunction toAgentContext<TState, TAction, TActionResult, TEval extends ControlEvalResult>(\n task: AgentTaskSpec,\n knowledge: KnowledgeReadinessReport,\n ctx: ControlContext<TState, TAction, TActionResult, TEval>,\n): AgentTaskContext<TState, TAction, TActionResult, TEval> {\n return {\n task,\n knowledge,\n state: ctx.state,\n evals: ctx.evals,\n history: ctx.history,\n budget: ctx.budget,\n stepIndex: ctx.stepIndex,\n wallMs: ctx.wallMs,\n spentCostUsd: ctx.spentCostUsd,\n remainingCostUsd: ctx.remainingCostUsd,\n abortSignal: ctx.abortSignal,\n }\n}\n\nexport type {\n ControlBudget,\n ControlDecision,\n ControlEvalResult,\n ControlRunResult,\n ControlStep,\n DataAcquisitionPlan,\n KnowledgeReadinessReport,\n KnowledgeRequirement,\n RunRecord,\n UserQuestion,\n} from '@tangle-network/agent-eval'\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-runtime",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Reusable runtime lifecycle for domain-specific agents.",
5
5
  "homepage": "https://github.com/tangle-network/agent-runtime#readme",
6
6
  "repository": {