@deepstrike/sdk 0.2.17 → 0.2.18

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.
@@ -84,7 +84,6 @@ export class HarnessLoop {
84
84
  }
85
85
  async *stream(request) {
86
86
  const kernel = getKernel();
87
- const pipeline = new kernel.EvalPipeline({ extractSkillOnPass: true });
88
87
  const criteria = request.criteria ?? [];
89
88
  let currentGoal = request.goal;
90
89
  let lastIterations = 0;
@@ -126,11 +125,10 @@ export class HarnessLoop {
126
125
  }
127
126
  }
128
127
  yield { type: "supervising" };
129
- const evalAction = pipeline.feedOutcome(request.goal, criteria, lastResult, attempt);
130
- if (evalAction.kind !== "evaluate")
131
- break;
128
+ // #6 (0.5.0): the eval/verdict compute is the kernel's stateless free functions (was the
129
+ // EvalPipeline state machine). Build the eval prompt, call the eval LLM, parse the verdict.
130
+ const evalMsgs = kernel.buildEvalMessages(request.goal, criteria, lastResult, attempt, true);
132
131
  let evalText = "";
133
- const evalMsgs = evalAction.messages ?? [];
134
132
  const evalContext = {
135
133
  systemText: evalMsgs.filter((m) => m.role === "system").map((m) => m.content).join("\n\n"),
136
134
  turns: evalMsgs.filter((m) => m.role !== "system"),
@@ -139,18 +137,16 @@ export class HarnessLoop {
139
137
  if (evt.type === "text_delta")
140
138
  evalText += evt.delta;
141
139
  }
142
- const doneAction = pipeline.feedEvalResult(evalText);
143
- if (doneAction.kind !== "done")
144
- break;
140
+ const parsed = kernel.parseVerdict(evalText);
145
141
  const verdict = {
146
- passed: doneAction.passed ?? false,
147
- overallScore: doneAction.overallScore ?? 0,
148
- feedback: doneAction.feedback ?? "",
149
- details: doneAction.details ?? [],
142
+ passed: parsed.passed,
143
+ overallScore: parsed.overallScore,
144
+ feedback: parsed.feedback,
145
+ details: parsed.details ?? [],
150
146
  };
151
147
  if (verdict.passed) {
152
- if (doneAction.skillCandidate && this.skillDir) {
153
- const { name, description, whenToUse, content } = doneAction.skillCandidate;
148
+ if (parsed.skillCandidate && this.skillDir) {
149
+ const { name, description, whenToUse, content } = parsed.skillCandidate;
154
150
  const fm = ["---", `name: ${name}`, `description: ${description}`,
155
151
  whenToUse ? `when_to_use: ${whenToUse}` : null, "---", ""]
156
152
  .filter(Boolean).join("\n");
@@ -162,7 +158,6 @@ export class HarnessLoop {
162
158
  yield { type: "revising", verdict };
163
159
  currentGoal = `${request.goal}\n\n[Attempt ${attempt} feedback: ${verdict.feedback}]`;
164
160
  lastResult = "";
165
- pipeline.reset();
166
161
  }
167
162
  yield { type: "max_attempts_reached" };
168
163
  }
package/dist/index.d.ts CHANGED
@@ -68,7 +68,7 @@ export { SinglePassHarness, EvalLoopHarness, HarnessLoop } from "./harness/harne
68
68
  export type { HarnessRequest, HarnessOutcome, HarnessLoopOptions, QualityGate } from "./harness/harness.js";
69
69
  export type { Message, ToolCall, ToolResult, ToolSchema, ContentPart, TextPart, ImagePart, AudioPart, StreamEvent, TextDelta, ThinkingDelta, ToolCallEvent, ToolChunk, ToolDeltaEvent, ToolSuspendEvent, ToolResultEvent, DoneEvent, ErrorEvent, PermissionRequestEvent, PermissionResolvedEvent, PermissionResponse, LLMProvider, RetryConfig, TokenUsage, ProviderToolSpec, ProviderRunState, ProviderReplay, RenderedContext, ReplayabilityAssessment, } from "./types.js";
70
70
  export type { AgentCapabilityFilter, AgentIdentity, AgentIsolation, AgentRunSpec, AgentProcessChangedObservation, ContextInheritance, KernelAgentRole, LoopResult, MilestoneCheckResult, MilestoneContract, MilestonePhase, MilestonePolicy, SubAgentResult, TerminationReason, WorkflowSpec, WorkflowNodeSpec, WorkflowTaskSpec, WorkflowSpawnInfo, } from "./types/agent.js";
71
- export { agentIdentitySub, agentRunSpecToKernel, milestoneCheckFail, milestoneCheckPass, milestoneCheckResultToKernel, subAgentResultToKernel, workflowSpecToKernel, workflowNodeSpecToKernel, submitWorkflowNodesToKernel, submitWorkflowToKernel, submitWorkflowNodesTool, startWorkflowTool, fanoutSynthesize, generateAndFilter, verifyRules, } from "./types/agent.js";
71
+ export { agentIdentitySub, agentRunSpecToKernel, milestoneCheckFail, milestoneCheckPass, milestoneCheckResultToKernel, subAgentResultToKernel, workflowSpecToKernel, workflowNodeSpecToKernel, submitWorkflowNodesToKernel, submitWorkflowToKernel, submitWorkflowNodesTool, startWorkflowTool, fanoutSynthesize, generateAndFilter, verifyRules, genEval, } from "./types/agent.js";
72
72
  export type { AcceptanceCriterion, VerificationContract, ContractCheckResult, } from "./collaboration/contract.js";
73
73
  export { ContractBuilder, formatContractForSystemPrompt, contractToCriteriaStrings, } from "./collaboration/contract.js";
74
74
  export { AgentPool } from "./collaboration/pool.js";
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ export { PermissionManager, PermissionMode } from "./safety/permissions.js";
46
46
  export { Governance, governancePolicyToKernelEvent } from "./governance.js";
47
47
  // ── Harness ────────────────────────────────────────────────────────────────
48
48
  export { SinglePassHarness, EvalLoopHarness, HarnessLoop } from "./harness/harness.js";
49
- export { agentIdentitySub, agentRunSpecToKernel, milestoneCheckFail, milestoneCheckPass, milestoneCheckResultToKernel, subAgentResultToKernel, workflowSpecToKernel, workflowNodeSpecToKernel, submitWorkflowNodesToKernel, submitWorkflowToKernel, submitWorkflowNodesTool, startWorkflowTool, fanoutSynthesize, generateAndFilter, verifyRules, } from "./types/agent.js";
49
+ export { agentIdentitySub, agentRunSpecToKernel, milestoneCheckFail, milestoneCheckPass, milestoneCheckResultToKernel, subAgentResultToKernel, workflowSpecToKernel, workflowNodeSpecToKernel, submitWorkflowNodesToKernel, submitWorkflowToKernel, submitWorkflowNodesTool, startWorkflowTool, fanoutSynthesize, generateAndFilter, verifyRules, genEval, } from "./types/agent.js";
50
50
  export { ContractBuilder, formatContractForSystemPrompt, contractToCriteriaStrings, } from "./collaboration/contract.js";
51
51
  export { AgentPool } from "./collaboration/pool.js";
52
52
  export { KERNEL_ROLE_MAP } from "./collaboration/pool.js";
package/dist/kernel.d.ts CHANGED
@@ -77,13 +77,11 @@ interface NativeCriterion {
77
77
  required: boolean;
78
78
  weight?: number;
79
79
  }
80
- interface EvalPipelineAction {
81
- kind: "evaluate" | "done";
82
- messages?: Message[];
83
- passed?: boolean;
84
- overallScore?: number;
85
- feedback?: string;
86
- details?: Array<{
80
+ export interface Verdict {
81
+ passed: boolean;
82
+ overallScore: number;
83
+ feedback: string;
84
+ details: Array<{
87
85
  criterion: string;
88
86
  passed: boolean;
89
87
  score: number;
@@ -96,11 +94,6 @@ interface EvalPipelineAction {
96
94
  content: string;
97
95
  };
98
96
  }
99
- interface EvalPipelineInstance {
100
- feedOutcome(goal: string, criteria: NativeCriterion[], result: string, attempt: number): EvalPipelineAction;
101
- feedEvalResult(content: string): EvalPipelineAction;
102
- reset(): void;
103
- }
104
97
  interface IdlePipelineAction {
105
98
  kind: "synthesize_insights" | "commit_memories" | "noop" | "aborted";
106
99
  messages?: Message[];
@@ -156,9 +149,9 @@ interface KernelModule {
156
149
  timeoutMs?: bigint;
157
150
  }) => KernelRuntimeInstance;
158
151
  SignalRouter: new (maxQueueSize: number) => SignalRouterInstance;
159
- EvalPipeline: new (options?: {
160
- extractSkillOnPass?: boolean;
161
- }) => EvalPipelineInstance;
152
+ buildEvalMessages(goal: string, criteria: NativeCriterion[], result: string, attempt: number, extractSkillOnPass: boolean): Message[];
153
+ parseVerdict(content: string): Verdict;
154
+ verdictOutputSchema(extractSkillOnPass: boolean): string;
162
155
  IdlePipeline: new (agentId: string) => IdlePipelineInstance;
163
156
  }
164
157
  export declare function getKernel(): KernelModule;
@@ -225,6 +225,13 @@ export declare function workflowNodeToManifest(node: WorkflowSpawnInfo, parentSe
225
225
  export declare function fanoutSynthesize(workers: WorkflowTaskSpec[], synthesize: WorkflowTaskSpec): WorkflowSpec;
226
226
  /** N parallel Implement generators feeding a single Verify filter/dedupe step (barrier). */
227
227
  export declare function generateAndFilter(generators: WorkflowTaskSpec[], filter: WorkflowTaskSpec): WorkflowSpec;
228
+ /**
229
+ * Generate→evaluate quality gate (the EvalPipeline successor, #6): a `loop` worker node (re-run up
230
+ * to `maxIters`, stopping early on a `loop_continue=false` self-signal) + a bias-resistant `verify`
231
+ * eval node gated on it, carrying the kernel's verdict `outputSchema`. Mirrors the kernel `gen_eval`
232
+ * template. For the iterative retry-with-feedback variant, drive it with `HarnessLoop`.
233
+ */
234
+ export declare function genEval(worker: WorkflowTaskSpec, evaluate: WorkflowTaskSpec, maxIters?: number, extractSkillOnPass?: boolean): WorkflowSpec;
228
235
  /**
229
236
  * One fresh-context verifier per rule/claim (parallel) + optional skeptic that depends on all and
230
237
  * re-checks flags. Verifiers run read-only with no inherited author context (bias-resistant).
@@ -1,3 +1,4 @@
1
+ import { getKernel } from "../kernel.js";
1
2
  /** Map kernel spawn observation → host manifest. */
2
3
  export function spawnObservationToManifest(obs, spec, parentSessionId) {
3
4
  const o = obs;
@@ -409,6 +410,34 @@ export function generateAndFilter(generators, filter) {
409
410
  });
410
411
  return { nodes };
411
412
  }
413
+ /**
414
+ * Generate→evaluate quality gate (the EvalPipeline successor, #6): a `loop` worker node (re-run up
415
+ * to `maxIters`, stopping early on a `loop_continue=false` self-signal) + a bias-resistant `verify`
416
+ * eval node gated on it, carrying the kernel's verdict `outputSchema`. Mirrors the kernel `gen_eval`
417
+ * template. For the iterative retry-with-feedback variant, drive it with `HarnessLoop`.
418
+ */
419
+ export function genEval(worker, evaluate, maxIters = 3, extractSkillOnPass = true) {
420
+ const schema = JSON.parse(getKernel().verdictOutputSchema(extractSkillOnPass));
421
+ return {
422
+ nodes: [
423
+ {
424
+ task: asTask(worker),
425
+ role: "implement",
426
+ isolation: "worktree",
427
+ contextInheritance: "full",
428
+ loop: { maxIters: Math.max(1, maxIters) },
429
+ },
430
+ {
431
+ task: asTask(evaluate),
432
+ role: "verify",
433
+ isolation: "read_only",
434
+ contextInheritance: "none",
435
+ dependsOn: [0],
436
+ outputSchema: schema,
437
+ },
438
+ ],
439
+ };
440
+ }
412
441
  /**
413
442
  * One fresh-context verifier per rule/claim (parallel) + optional skeptic that depends on all and
414
443
  * re-checks flags. Verifiers run read-only with no inherited author context (bias-resistant).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepstrike/sdk",
3
- "version": "0.2.17",
3
+ "version": "0.2.18",
4
4
  "description": "DeepStrike Node.js SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "@anthropic-ai/sdk": "^0.99.0",
23
- "@deepstrike/core": "0.2.17",
23
+ "@deepstrike/core": "0.2.18",
24
24
  "@google/generative-ai": "^0.24.1",
25
25
  "openai": "^5.23.2"
26
26
  },