@archmax-ai/harness 0.0.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/LICENSE +21 -0
- package/README.md +219 -0
- package/dist/agent.d.ts +174 -0
- package/dist/agent.js +140 -0
- package/dist/agent.js.map +1 -0
- package/dist/assembly/compose.d.ts +170 -0
- package/dist/assembly/compose.js +391 -0
- package/dist/assembly/compose.js.map +1 -0
- package/dist/assembly/delegation-registry.d.ts +5 -0
- package/dist/assembly/delegation-registry.js +118 -0
- package/dist/assembly/delegation-registry.js.map +1 -0
- package/dist/assembly/index.d.ts +192 -0
- package/dist/assembly/index.js +265 -0
- package/dist/assembly/index.js.map +1 -0
- package/dist/assembly/plain.d.ts +7 -0
- package/dist/assembly/plain.js +41 -0
- package/dist/assembly/plain.js.map +1 -0
- package/dist/authoring-skill/archmax-harness/README.md +76 -0
- package/dist/authoring-skill/archmax-harness/SKILL.md +241 -0
- package/dist/authoring-skill/archmax-harness/references/backend-integration.md +626 -0
- package/dist/authoring-skill/archmax-harness/references/cases.md +41 -0
- package/dist/authoring-skill/archmax-harness/references/diagnostics.md +51 -0
- package/dist/authoring-skill/archmax-harness/references/hook-and-test-scripts.md +1070 -0
- package/dist/authoring-skill/archmax-harness/references/hooks-and-scripts.md +82 -0
- package/dist/authoring-skill/archmax-harness/references/wiring.md +101 -0
- package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +1631 -0
- package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +241 -0
- package/dist/behaviour/support.d.ts +232 -0
- package/dist/behaviour/support.js +339 -0
- package/dist/behaviour/support.js.map +1 -0
- package/dist/cli/banner.d.ts +11 -0
- package/dist/cli/banner.js +29 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +33 -0
- package/dist/cli/bootstrap.js +153 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/command.d.ts +39 -0
- package/dist/cli/command.js +97 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/state-flow.d.ts +46 -0
- package/dist/cli/state-flow.js +268 -0
- package/dist/cli/state-flow.js.map +1 -0
- package/dist/cli/style.d.ts +41 -0
- package/dist/cli/style.js +64 -0
- package/dist/cli/style.js.map +1 -0
- package/dist/cli/turn.d.ts +41 -0
- package/dist/cli/turn.js +161 -0
- package/dist/cli/turn.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +426 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/code-description.d.ts +22 -0
- package/dist/core/code-description.js +38 -0
- package/dist/core/code-description.js.map +1 -0
- package/dist/core/deepagents.d.ts +183 -0
- package/dist/core/deepagents.js +128 -0
- package/dist/core/deepagents.js.map +1 -0
- package/dist/core/events.d.ts +350 -0
- package/dist/core/events.js +205 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/frontmatter.d.ts +15 -0
- package/dist/core/frontmatter.js +32 -0
- package/dist/core/frontmatter.js.map +1 -0
- package/dist/core/listing-redact.d.ts +37 -0
- package/dist/core/listing-redact.js +88 -0
- package/dist/core/listing-redact.js.map +1 -0
- package/dist/core/match.d.ts +26 -0
- package/dist/core/match.js +75 -0
- package/dist/core/match.js.map +1 -0
- package/dist/core/message-readers.d.ts +84 -0
- package/dist/core/message-readers.js +159 -0
- package/dist/core/message-readers.js.map +1 -0
- package/dist/core/messages.d.ts +49 -0
- package/dist/core/messages.js +85 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/mount-prompt.d.ts +28 -0
- package/dist/core/mount-prompt.js +55 -0
- package/dist/core/mount-prompt.js.map +1 -0
- package/dist/core/mount-redact.d.ts +28 -0
- package/dist/core/mount-redact.js +32 -0
- package/dist/core/mount-redact.js.map +1 -0
- package/dist/core/mounts.d.ts +88 -0
- package/dist/core/mounts.js +147 -0
- package/dist/core/mounts.js.map +1 -0
- package/dist/core/path-mapping.d.ts +52 -0
- package/dist/core/path-mapping.js +113 -0
- package/dist/core/path-mapping.js.map +1 -0
- package/dist/core/platform-prompt.generated.d.ts +2 -0
- package/dist/core/platform-prompt.generated.js +4 -0
- package/dist/core/platform-prompt.generated.js.map +1 -0
- package/dist/core/prompt.d.ts +42 -0
- package/dist/core/prompt.js +75 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/session-id.d.ts +38 -0
- package/dist/core/session-id.js +61 -0
- package/dist/core/session-id.js.map +1 -0
- package/dist/core/session-store.d.ts +85 -0
- package/dist/core/session-store.js +149 -0
- package/dist/core/session-store.js.map +1 -0
- package/dist/core/session-zone.d.ts +54 -0
- package/dist/core/session-zone.js +82 -0
- package/dist/core/session-zone.js.map +1 -0
- package/dist/core/skill-prompt.d.ts +31 -0
- package/dist/core/skill-prompt.js +54 -0
- package/dist/core/skill-prompt.js.map +1 -0
- package/dist/core/skill-redact.d.ts +15 -0
- package/dist/core/skill-redact.js +27 -0
- package/dist/core/skill-redact.js.map +1 -0
- package/dist/core/skills.d.ts +172 -0
- package/dist/core/skills.js +214 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/tool-mocks.d.ts +23 -0
- package/dist/core/tool-mocks.js +39 -0
- package/dist/core/tool-mocks.js.map +1 -0
- package/dist/core/tool-telemetry.d.ts +16 -0
- package/dist/core/tool-telemetry.js +40 -0
- package/dist/core/tool-telemetry.js.map +1 -0
- package/dist/core/usage.d.ts +114 -0
- package/dist/core/usage.js +226 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/workspace-context.d.ts +136 -0
- package/dist/core/workspace-context.js +178 -0
- package/dist/core/workspace-context.js.map +1 -0
- package/dist/core/workspace-prompt.d.ts +7 -0
- package/dist/core/workspace-prompt.js +102 -0
- package/dist/core/workspace-prompt.js.map +1 -0
- package/dist/core/workspace-router.d.ts +61 -0
- package/dist/core/workspace-router.js +145 -0
- package/dist/core/workspace-router.js.map +1 -0
- package/dist/core/workspace.d.ts +85 -0
- package/dist/core/workspace.js +193 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/core/zones.d.ts +181 -0
- package/dist/core/zones.js +202 -0
- package/dist/core/zones.js.map +1 -0
- package/dist/env.d.ts +99 -0
- package/dist/env.js +271 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +265 -0
- package/dist/index.js +197 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/kernel.d.ts +192 -0
- package/dist/kernel/kernel.js +751 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/lifecycle/hook-shape.d.ts +44 -0
- package/dist/lifecycle/hook-shape.js +66 -0
- package/dist/lifecycle/hook-shape.js.map +1 -0
- package/dist/lifecycle/runner.d.ts +177 -0
- package/dist/lifecycle/runner.js +372 -0
- package/dist/lifecycle/runner.js.map +1 -0
- package/dist/lifecycle/transcript.d.ts +27 -0
- package/dist/lifecycle/transcript.js +43 -0
- package/dist/lifecycle/transcript.js.map +1 -0
- package/dist/machine/allow.d.ts +65 -0
- package/dist/machine/allow.js +107 -0
- package/dist/machine/allow.js.map +1 -0
- package/dist/machine/delegation.d.ts +9 -0
- package/dist/machine/delegation.js +10 -0
- package/dist/machine/delegation.js.map +1 -0
- package/dist/machine/diagnostic.d.ts +14 -0
- package/dist/machine/diagnostic.js +2 -0
- package/dist/machine/diagnostic.js.map +1 -0
- package/dist/machine/lint-spec.d.ts +4 -0
- package/dist/machine/lint-spec.js +266 -0
- package/dist/machine/lint-spec.js.map +1 -0
- package/dist/machine/load-spec.d.ts +90 -0
- package/dist/machine/load-spec.js +120 -0
- package/dist/machine/load-spec.js.map +1 -0
- package/dist/machine/machine.d.ts +273 -0
- package/dist/machine/machine.js +551 -0
- package/dist/machine/machine.js.map +1 -0
- package/dist/machine/mount-grants.d.ts +25 -0
- package/dist/machine/mount-grants.js +24 -0
- package/dist/machine/mount-grants.js.map +1 -0
- package/dist/machine/slug.d.ts +14 -0
- package/dist/machine/slug.js +17 -0
- package/dist/machine/slug.js.map +1 -0
- package/dist/machine/spec-schema.d.ts +662 -0
- package/dist/machine/spec-schema.js +717 -0
- package/dist/machine/spec-schema.js.map +1 -0
- package/dist/machine/tool-names.d.ts +98 -0
- package/dist/machine/tool-names.js +144 -0
- package/dist/machine/tool-names.js.map +1 -0
- package/dist/machine/triggers.d.ts +114 -0
- package/dist/machine/triggers.js +165 -0
- package/dist/machine/triggers.js.map +1 -0
- package/dist/machine/types.d.ts +186 -0
- package/dist/machine/types.js +12 -0
- package/dist/machine/types.js.map +1 -0
- package/dist/machine/validate-spec.d.ts +42 -0
- package/dist/machine/validate-spec.js +29 -0
- package/dist/machine/validate-spec.js.map +1 -0
- package/dist/machine/variables.d.ts +196 -0
- package/dist/machine/variables.js +415 -0
- package/dist/machine/variables.js.map +1 -0
- package/dist/public/cli.d.ts +15 -0
- package/dist/public/cli.js +14 -0
- package/dist/public/cli.js.map +1 -0
- package/dist/public/messages.d.ts +33 -0
- package/dist/public/messages.js +33 -0
- package/dist/public/messages.js.map +1 -0
- package/dist/public/sandbox.d.ts +99 -0
- package/dist/public/sandbox.js +32 -0
- package/dist/public/sandbox.js.map +1 -0
- package/dist/public/spec.d.ts +147 -0
- package/dist/public/spec.js +149 -0
- package/dist/public/spec.js.map +1 -0
- package/dist/public/testing.d.ts +71 -0
- package/dist/public/testing.js +39 -0
- package/dist/public/testing.js.map +1 -0
- package/dist/rubrics/rubrics.d.ts +135 -0
- package/dist/rubrics/rubrics.js +145 -0
- package/dist/rubrics/rubrics.js.map +1 -0
- package/dist/runtime/contract.d.ts +73 -0
- package/dist/runtime/contract.js +96 -0
- package/dist/runtime/contract.js.map +1 -0
- package/dist/sandbox/assets/parts/core.js +22 -0
- package/dist/sandbox/assets/parts/lifecycle-hook.js +47 -0
- package/dist/sandbox/bridge.d.ts +16 -0
- package/dist/sandbox/bridge.js +95 -0
- package/dist/sandbox/bridge.js.map +1 -0
- package/dist/sandbox/executor.d.ts +46 -0
- package/dist/sandbox/executor.js +119 -0
- package/dist/sandbox/executor.js.map +1 -0
- package/dist/sandbox/imports.d.ts +33 -0
- package/dist/sandbox/imports.js +67 -0
- package/dist/sandbox/imports.js.map +1 -0
- package/dist/sandbox/prelude.d.ts +12 -0
- package/dist/sandbox/prelude.js +51 -0
- package/dist/sandbox/prelude.js.map +1 -0
- package/dist/sandbox/ptc-gateway.d.ts +104 -0
- package/dist/sandbox/ptc-gateway.js +167 -0
- package/dist/sandbox/ptc-gateway.js.map +1 -0
- package/dist/sandbox/runtime.d.ts +59 -0
- package/dist/sandbox/runtime.js +51 -0
- package/dist/sandbox/runtime.js.map +1 -0
- package/dist/sandbox/tools.d.ts +34 -0
- package/dist/sandbox/tools.js +147 -0
- package/dist/sandbox/tools.js.map +1 -0
- package/dist/sessions/operations.d.ts +79 -0
- package/dist/sessions/operations.js +121 -0
- package/dist/sessions/operations.js.map +1 -0
- package/dist/sessions/resolve.d.ts +97 -0
- package/dist/sessions/resolve.js +145 -0
- package/dist/sessions/resolve.js.map +1 -0
- package/dist/sessions/resume.d.ts +242 -0
- package/dist/sessions/resume.js +288 -0
- package/dist/sessions/resume.js.map +1 -0
- package/dist/sessions/scope.d.ts +99 -0
- package/dist/sessions/scope.js +145 -0
- package/dist/sessions/scope.js.map +1 -0
- package/dist/sessions/summary.d.ts +65 -0
- package/dist/sessions/summary.js +56 -0
- package/dist/sessions/summary.js.map +1 -0
- package/dist/testing/assertions.d.ts +30 -0
- package/dist/testing/assertions.js +231 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/case-document.d.ts +141 -0
- package/dist/testing/case-document.js +51 -0
- package/dist/testing/case-document.js.map +1 -0
- package/dist/testing/case-schema.d.ts +29 -0
- package/dist/testing/case-schema.js +519 -0
- package/dist/testing/case-schema.js.map +1 -0
- package/dist/testing/discovery.d.ts +10 -0
- package/dist/testing/discovery.js +24 -0
- package/dist/testing/discovery.js.map +1 -0
- package/dist/testing/driver.d.ts +78 -0
- package/dist/testing/driver.js +117 -0
- package/dist/testing/driver.js.map +1 -0
- package/dist/testing/grade.d.ts +116 -0
- package/dist/testing/grade.js +261 -0
- package/dist/testing/grade.js.map +1 -0
- package/dist/testing/interpreter.d.ts +55 -0
- package/dist/testing/interpreter.js +103 -0
- package/dist/testing/interpreter.js.map +1 -0
- package/dist/testing/mock-middleware.d.ts +5 -0
- package/dist/testing/mock-middleware.js +33 -0
- package/dist/testing/mock-middleware.js.map +1 -0
- package/dist/testing/runner.d.ts +205 -0
- package/dist/testing/runner.js +266 -0
- package/dist/testing/runner.js.map +1 -0
- package/dist/testing/target.d.ts +27 -0
- package/dist/testing/target.js +21 -0
- package/dist/testing/target.js.map +1 -0
- package/dist/validate/validate.d.ts +41 -0
- package/dist/validate/validate.js +669 -0
- package/dist/validate/validate.js.map +1 -0
- package/dist/workflow/agent-tools.d.ts +10 -0
- package/dist/workflow/agent-tools.js +10 -0
- package/dist/workflow/agent-tools.js.map +1 -0
- package/dist/workflow/checkpointer.d.ts +52 -0
- package/dist/workflow/checkpointer.js +200 -0
- package/dist/workflow/checkpointer.js.map +1 -0
- package/dist/workflow/control-tools.d.ts +174 -0
- package/dist/workflow/control-tools.js +468 -0
- package/dist/workflow/control-tools.js.map +1 -0
- package/dist/workflow/governance.d.ts +104 -0
- package/dist/workflow/governance.js +546 -0
- package/dist/workflow/governance.js.map +1 -0
- package/dist/workflow/middleware.d.ts +85 -0
- package/dist/workflow/middleware.js +283 -0
- package/dist/workflow/middleware.js.map +1 -0
- package/dist/workflow/on-error.d.ts +25 -0
- package/dist/workflow/on-error.js +58 -0
- package/dist/workflow/on-error.js.map +1 -0
- package/dist/workflow/parks.d.ts +46 -0
- package/dist/workflow/parks.js +513 -0
- package/dist/workflow/parks.js.map +1 -0
- package/dist/workflow/paths.d.ts +67 -0
- package/dist/workflow/paths.js +108 -0
- package/dist/workflow/paths.js.map +1 -0
- package/dist/workflow/prompt-cache.d.ts +70 -0
- package/dist/workflow/prompt-cache.js +103 -0
- package/dist/workflow/prompt-cache.js.map +1 -0
- package/dist/workflow/prompt-pruning.d.ts +20 -0
- package/dist/workflow/prompt-pruning.js +83 -0
- package/dist/workflow/prompt-pruning.js.map +1 -0
- package/dist/workflow/render-prompt.d.ts +45 -0
- package/dist/workflow/render-prompt.js +140 -0
- package/dist/workflow/render-prompt.js.map +1 -0
- package/dist/workflow/runtime-config.d.ts +7 -0
- package/dist/workflow/runtime-config.js +9 -0
- package/dist/workflow/runtime-config.js.map +1 -0
- package/dist/workflow/session-artifacts.d.ts +90 -0
- package/dist/workflow/session-artifacts.js +134 -0
- package/dist/workflow/session-artifacts.js.map +1 -0
- package/dist/workflow/session-view.d.ts +31 -0
- package/dist/workflow/session-view.js +94 -0
- package/dist/workflow/session-view.js.map +1 -0
- package/dist/workflow/snapshot.d.ts +14 -0
- package/dist/workflow/snapshot.js +97 -0
- package/dist/workflow/snapshot.js.map +1 -0
- package/dist/workflow/state.d.ts +347 -0
- package/dist/workflow/state.js +322 -0
- package/dist/workflow/state.js.map +1 -0
- package/dist/workflow/sub-workflow.d.ts +174 -0
- package/dist/workflow/sub-workflow.js +392 -0
- package/dist/workflow/sub-workflow.js.map +1 -0
- package/dist/workflow/tool-service.d.ts +48 -0
- package/dist/workflow/tool-service.js +291 -0
- package/dist/workflow/tool-service.js.map +1 -0
- package/dist/workflow/turn-boundary.d.ts +39 -0
- package/dist/workflow/turn-boundary.js +128 -0
- package/dist/workflow/turn-boundary.js.map +1 -0
- package/dist/workflow/turn-runner.d.ts +40 -0
- package/dist/workflow/turn-runner.js +122 -0
- package/dist/workflow/turn-runner.js.map +1 -0
- package/dist/workflow/workflow-tools.d.ts +46 -0
- package/dist/workflow/workflow-tools.js +90 -0
- package/dist/workflow/workflow-tools.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The declarative case schema: one YAML document per `*.test.yaml` file,
|
|
3
|
+
* parsed and validated fail-closed. Unknown keys are errors — a typo'd
|
|
4
|
+
* assertion must never silently pass — and every rejection names the file and
|
|
5
|
+
* the offending location so the author can fix it without running anything.
|
|
6
|
+
*
|
|
7
|
+
* A case is one conversation on one session: `steps` is a single flat,
|
|
8
|
+
* sequential list in which actions (`send`, `decide`, `deliver`) and assertions
|
|
9
|
+
* (`reachedState`, `reply`, `grade`, …) are peers. An assertion evaluates
|
|
10
|
+
* against the view of the nearest action above it; an assertion with no
|
|
11
|
+
* preceding action is a schema error. A case file carries no version of its
|
|
12
|
+
* own: the authoring surface is versioned once, by `runtime.version`.
|
|
13
|
+
*
|
|
14
|
+
* Everything is zod: leaf shapes are strict objects, each step key maps to one
|
|
15
|
+
* schema in {@link STEP_SCHEMAS}, and a single-key dispatcher names an unknown
|
|
16
|
+
* key and lists the known ones. `validateWorkflow` and the runner share it.
|
|
17
|
+
*/
|
|
18
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
import { regexFromString } from "../core/match.js";
|
|
21
|
+
import { CaseSchemaError, caseIdForFile, } from "./case-document.js";
|
|
22
|
+
// The document model and its path helpers are re-exported so every importer
|
|
23
|
+
// of the grammar sees one module.
|
|
24
|
+
export { CaseSchemaError, TEST_FILE_EXTENSIONS, caseIdForFile, collectFileReferences, isTestFile, normalizeFixturePath, stripTestExtension, } from "./case-document.js";
|
|
25
|
+
import { VARIABLE_NAME_PATTERN } from "../machine/variables.js";
|
|
26
|
+
/**
|
|
27
|
+
* Length budgets for the two prose fields. `title` is a label the CLI prints
|
|
28
|
+
* beside a verdict, so it has to fit a terminal line; `description` states the
|
|
29
|
+
* scenario and what is asserted in a sentence or two. Longer rationale belongs
|
|
30
|
+
* in a YAML comment above the document. Measured on whitespace-collapsed text
|
|
31
|
+
* so a folded (`>-`) and a literal (`|`) block of the same prose score alike.
|
|
32
|
+
*/
|
|
33
|
+
export const CASE_TITLE_MAX_LENGTH = 60;
|
|
34
|
+
export const CASE_DESCRIPTION_MAX_LENGTH = 200;
|
|
35
|
+
const collapseWhitespace = (value) => value.replace(/\s+/g, " ").trim();
|
|
36
|
+
function isPlainObject(value) {
|
|
37
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
38
|
+
}
|
|
39
|
+
const action = (a) => ({ kind: "action", action: a });
|
|
40
|
+
const assertion = (e) => ({ kind: "assert", expect: e });
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Leaf vocabulary
|
|
43
|
+
/** A `/pattern/flags` string is a regex; a malformed one is a static error, never a literal. */
|
|
44
|
+
function checkRegexString(raw, ctx, path = []) {
|
|
45
|
+
try {
|
|
46
|
+
regexFromString(raw);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
ctx.addIssue({
|
|
50
|
+
code: "custom",
|
|
51
|
+
path,
|
|
52
|
+
message: `malformed regex ${JSON.stringify(raw)}: ${err.message}`,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Reject malformed regex strings anywhere inside a matcher value (tool input, `whenInput`). */
|
|
57
|
+
function checkMatcherStrings(value, ctx, path = []) {
|
|
58
|
+
if (typeof value === "string")
|
|
59
|
+
return checkRegexString(value, ctx, path);
|
|
60
|
+
if (Array.isArray(value))
|
|
61
|
+
value.forEach((v, i) => checkMatcherStrings(v, ctx, [...path, i]));
|
|
62
|
+
else if (isPlainObject(value)) {
|
|
63
|
+
for (const [k, v] of Object.entries(value))
|
|
64
|
+
checkMatcherStrings(v, ctx, [...path, k]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const matcherSchema = z
|
|
68
|
+
.record(z.string(), z.unknown())
|
|
69
|
+
.superRefine((value, ctx) => checkMatcherStrings(value, ctx));
|
|
70
|
+
/** `includes`/`excludes` accept a single token or a list of tokens; `/pattern/flags` compiles to a regex. */
|
|
71
|
+
const replyTokens = z
|
|
72
|
+
.union([z.string(), z.array(z.string())])
|
|
73
|
+
.transform((value, ctx) => {
|
|
74
|
+
const list = typeof value === "string" ? [value] : value;
|
|
75
|
+
return list.map((raw, i) => {
|
|
76
|
+
try {
|
|
77
|
+
const regex = regexFromString(raw);
|
|
78
|
+
return regex ? { raw, regex } : { raw };
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
ctx.addIssue({
|
|
82
|
+
code: "custom",
|
|
83
|
+
path: typeof value === "string" ? [] : [i],
|
|
84
|
+
message: `malformed regex ${JSON.stringify(raw)}: ${err.message}`,
|
|
85
|
+
});
|
|
86
|
+
return { raw };
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
const literalTrue = (key) => z.literal(true, { error: `'${key}' takes the literal true` });
|
|
91
|
+
const slug = (what) => z.string({ error: `takes a ${what} string` }).min(1, `takes a ${what} string`);
|
|
92
|
+
const toolCall = (key) => z
|
|
93
|
+
.strictObject({ name: z.string().min(1), input: matcherSchema.optional() })
|
|
94
|
+
.transform((v) => assertion({ assert: key, name: v.name, ...(v.input && { input: v.input }) }));
|
|
95
|
+
/**
|
|
96
|
+
* `grade`: a model scores the turn against `closedQA`; `atLeast` decides the
|
|
97
|
+
* outcome. Also reachable as `judge:` for one release, with a deprecation
|
|
98
|
+
* warning printed once per process.
|
|
99
|
+
*/
|
|
100
|
+
const gradeSchema = z
|
|
101
|
+
.strictObject({ closedQA: z.string().min(1), atLeast: z.number().min(0).max(1) })
|
|
102
|
+
.transform((v) => assertion({ assert: "grade", closedQA: v.closedQA, atLeast: v.atLeast }));
|
|
103
|
+
let judgeAliasWarned = false;
|
|
104
|
+
const judgeAlias = gradeSchema.transform((step) => {
|
|
105
|
+
if (!judgeAliasWarned) {
|
|
106
|
+
judgeAliasWarned = true;
|
|
107
|
+
console.warn("[testing] the 'judge:' step is deprecated — rename it to 'grade:' (same shape); " +
|
|
108
|
+
"the alias will be removed in the next release.");
|
|
109
|
+
}
|
|
110
|
+
return step;
|
|
111
|
+
});
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// The step registry: one zod schema per step key, each yielding a CaseStep.
|
|
114
|
+
const ACTION_SCHEMAS = {
|
|
115
|
+
send: slug("user message").transform((message) => action({ action: "send", message })),
|
|
116
|
+
decide: z
|
|
117
|
+
.strictObject({ to: z.string().min(1), comment: z.string().optional() })
|
|
118
|
+
.transform((v) => action({
|
|
119
|
+
action: "decide",
|
|
120
|
+
to: v.to,
|
|
121
|
+
...(v.comment !== undefined && { comment: v.comment }),
|
|
122
|
+
})),
|
|
123
|
+
/**
|
|
124
|
+
* A firing delivered into a park: the trigger id the resumed session adopts
|
|
125
|
+
* and the variables the event carried. Any id is deliverable, so only its
|
|
126
|
+
* presence is checked; variable names are checked here so an unaddressable
|
|
127
|
+
* name fails at parse time rather than mid-run.
|
|
128
|
+
*/
|
|
129
|
+
deliver: z
|
|
130
|
+
.strictObject({
|
|
131
|
+
trigger: z.string().min(1),
|
|
132
|
+
variables: z.record(z.string().regex(VARIABLE_NAME_PATTERN), z.unknown()).optional(),
|
|
133
|
+
})
|
|
134
|
+
.transform((v) => action({
|
|
135
|
+
action: "deliver",
|
|
136
|
+
trigger: v.trigger,
|
|
137
|
+
...(v.variables && { variables: v.variables }),
|
|
138
|
+
})),
|
|
139
|
+
};
|
|
140
|
+
const parkedPinSchema = z.strictObject({
|
|
141
|
+
channel: z.enum(["decision", "input"]).optional(),
|
|
142
|
+
node: z.string().min(1).optional(),
|
|
143
|
+
});
|
|
144
|
+
/** Re-issue a nested parse's failures on the outer context (paths preserved), yielding `null` on failure. */
|
|
145
|
+
function forward(result, ctx, prefix = []) {
|
|
146
|
+
if (result.success)
|
|
147
|
+
return result.data;
|
|
148
|
+
for (const issue of result.error.issues) {
|
|
149
|
+
ctx.addIssue({
|
|
150
|
+
code: "custom",
|
|
151
|
+
path: [...prefix, ...issue.path],
|
|
152
|
+
message: renderIssue({ ...issue, path: [] }),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const ASSERTION_SCHEMAS = {
|
|
158
|
+
succeeded: literalTrue("succeeded").transform(() => assertion({ assert: "succeeded" })),
|
|
159
|
+
usedNoTools: literalTrue("usedNoTools").transform(() => assertion({ assert: "usedNoTools" })),
|
|
160
|
+
noTraversal: literalTrue("noTraversal").transform(() => assertion({ assert: "noTraversal" })),
|
|
161
|
+
/**
|
|
162
|
+
* `true` asserts a park in either channel; naming one pins it, so a wait
|
|
163
|
+
* flow cannot pass by parking at a human state instead. The mapping form
|
|
164
|
+
* also pins *where* the session parked — which `reachedState` cannot express,
|
|
165
|
+
* since parking commits no transition.
|
|
166
|
+
*/
|
|
167
|
+
parked: z.unknown().transform((raw, ctx) => {
|
|
168
|
+
let pin = null;
|
|
169
|
+
if (raw === true)
|
|
170
|
+
pin = {};
|
|
171
|
+
else if (raw === "decision" || raw === "input")
|
|
172
|
+
pin = { channel: raw };
|
|
173
|
+
else if (isPlainObject(raw))
|
|
174
|
+
pin = forward(parkedPinSchema.safeParse(raw), ctx);
|
|
175
|
+
else {
|
|
176
|
+
ctx.addIssue({
|
|
177
|
+
code: "custom",
|
|
178
|
+
message: "'parked' takes the literal true, 'decision' | 'input' to pin the channel, " +
|
|
179
|
+
"or a mapping { channel?, node? } to pin where the session parked",
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
if (!pin)
|
|
183
|
+
return z.NEVER;
|
|
184
|
+
return assertion({
|
|
185
|
+
assert: "parked",
|
|
186
|
+
...(pin.channel && { channel: pin.channel }),
|
|
187
|
+
...(pin.node && { node: pin.node }),
|
|
188
|
+
});
|
|
189
|
+
}),
|
|
190
|
+
reachedState: slug("state slug").transform((state) => assertion({ assert: "reachedState", state })),
|
|
191
|
+
triggerArrival: slug("trigger id").transform((trigger) => assertion({ assert: "triggerArrival", trigger })),
|
|
192
|
+
reply: z
|
|
193
|
+
.strictObject({ includes: replyTokens.optional(), excludes: replyTokens.optional() })
|
|
194
|
+
.refine((v) => v.includes !== undefined || v.excludes !== undefined, {
|
|
195
|
+
message: "declare at least one of 'includes'/'excludes'",
|
|
196
|
+
})
|
|
197
|
+
.transform((v) => assertion({ assert: "reply", includes: v.includes ?? [], excludes: v.excludes ?? [] })),
|
|
198
|
+
calledTool: toolCall("calledTool"),
|
|
199
|
+
notCalledTool: toolCall("notCalledTool"),
|
|
200
|
+
blockedTool: toolCall("blockedTool"),
|
|
201
|
+
/** `status` defaults to `ok`: the interesting assertion is almost always "it ran and worked". */
|
|
202
|
+
ranWorkflow: z
|
|
203
|
+
.strictObject({
|
|
204
|
+
workflow: z.string().min(1),
|
|
205
|
+
status: z.enum(["ok", "error"]).optional(),
|
|
206
|
+
count: z.number().int().nonnegative().optional(),
|
|
207
|
+
})
|
|
208
|
+
.transform((v) => assertion({
|
|
209
|
+
assert: "ranWorkflow",
|
|
210
|
+
workflow: v.workflow,
|
|
211
|
+
status: v.status ?? "ok",
|
|
212
|
+
...(v.count !== undefined && { count: v.count }),
|
|
213
|
+
})),
|
|
214
|
+
trail: z
|
|
215
|
+
.strictObject({
|
|
216
|
+
to: z.string().optional(),
|
|
217
|
+
kind: z.string().optional(),
|
|
218
|
+
reason: z.string().optional(),
|
|
219
|
+
count: z.number().int().nonnegative(),
|
|
220
|
+
})
|
|
221
|
+
.refine((v) => v.to !== undefined || v.kind !== undefined || v.reason !== undefined, {
|
|
222
|
+
message: "declare at least one of 'to'/'kind'/'reason' to match against",
|
|
223
|
+
})
|
|
224
|
+
.transform((v) => assertion({
|
|
225
|
+
assert: "trail",
|
|
226
|
+
...(v.to !== undefined && { to: v.to }),
|
|
227
|
+
...(v.kind !== undefined && { stepKind: v.kind }),
|
|
228
|
+
...(v.reason !== undefined && { reason: v.reason }),
|
|
229
|
+
count: v.count,
|
|
230
|
+
})),
|
|
231
|
+
variables: z
|
|
232
|
+
.strictObject({
|
|
233
|
+
expect: z.record(z.string(), z.unknown()),
|
|
234
|
+
/** Per-name dotted path into a structured value, e.g. `items.0.sku`. */
|
|
235
|
+
path: z.record(z.string(), z.string()).optional(),
|
|
236
|
+
/** Per-name expected lock state. */
|
|
237
|
+
locked: z.record(z.string(), z.boolean()).optional(),
|
|
238
|
+
})
|
|
239
|
+
.transform((v) => assertion({
|
|
240
|
+
assert: "variables",
|
|
241
|
+
expect: v.expect,
|
|
242
|
+
...(v.path && { path: v.path }),
|
|
243
|
+
...(v.locked && { locked: v.locked }),
|
|
244
|
+
})),
|
|
245
|
+
grade: gradeSchema,
|
|
246
|
+
};
|
|
247
|
+
/** Every step key the grammar knows, actions first. `judge` is the deprecated alias of `grade`. */
|
|
248
|
+
export const STEP_SCHEMAS = {
|
|
249
|
+
...ACTION_SCHEMAS,
|
|
250
|
+
...ASSERTION_SCHEMAS,
|
|
251
|
+
judge: judgeAlias,
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* The single-key dispatcher: a step is a mapping with exactly one key, and that
|
|
255
|
+
* key selects its schema. An unknown key is named alongside the known ones —
|
|
256
|
+
* which a bare union could not do.
|
|
257
|
+
*/
|
|
258
|
+
const stepSchema = z.unknown().transform((raw, ctx) => {
|
|
259
|
+
if (!isPlainObject(raw)) {
|
|
260
|
+
ctx.addIssue({
|
|
261
|
+
code: "custom",
|
|
262
|
+
message: "a step is a single-key mapping — an action ('send', 'decide', 'deliver') or an assertion " +
|
|
263
|
+
"(e.g. '- send: \"hi\"' then '- reachedState: done')",
|
|
264
|
+
});
|
|
265
|
+
return z.NEVER;
|
|
266
|
+
}
|
|
267
|
+
const keys = Object.keys(raw);
|
|
268
|
+
if (keys.length !== 1) {
|
|
269
|
+
ctx.addIssue({
|
|
270
|
+
code: "custom",
|
|
271
|
+
message: `a step declares exactly one key, got [${keys.join(", ") || "none"}]`,
|
|
272
|
+
});
|
|
273
|
+
return z.NEVER;
|
|
274
|
+
}
|
|
275
|
+
const key = keys[0];
|
|
276
|
+
const schema = STEP_SCHEMAS[key];
|
|
277
|
+
if (!schema) {
|
|
278
|
+
ctx.addIssue({
|
|
279
|
+
code: "custom",
|
|
280
|
+
message: `unknown step '${key}' (actions: ${Object.keys(ACTION_SCHEMAS).join(", ")}; ` +
|
|
281
|
+
`assertions: ${Object.keys(ASSERTION_SCHEMAS).join(", ")})`,
|
|
282
|
+
});
|
|
283
|
+
return z.NEVER;
|
|
284
|
+
}
|
|
285
|
+
return forward(schema.safeParse(raw[key]), ctx, [key]) ?? z.NEVER;
|
|
286
|
+
});
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
// The document
|
|
289
|
+
const workspaceEntry = z.unknown().transform((content, ctx) => {
|
|
290
|
+
// A single-key `{ from: <path> }` mapping is a file reference; everything
|
|
291
|
+
// else (strings, mappings, lists, scalars) is inline content.
|
|
292
|
+
if (isPlainObject(content) && Object.keys(content).length === 1 && "from" in content) {
|
|
293
|
+
const from = content.from;
|
|
294
|
+
if (typeof from !== "string" || from.length === 0) {
|
|
295
|
+
ctx.addIssue({ code: "custom", message: "'from' takes a tests/-relative file path string" });
|
|
296
|
+
return z.NEVER;
|
|
297
|
+
}
|
|
298
|
+
return { source: "file", from };
|
|
299
|
+
}
|
|
300
|
+
return { source: "inline", content };
|
|
301
|
+
});
|
|
302
|
+
const mockSchema = z
|
|
303
|
+
.strictObject({
|
|
304
|
+
tool: z.string().min(1),
|
|
305
|
+
whenInput: matcherSchema.optional(),
|
|
306
|
+
result: z.unknown(),
|
|
307
|
+
})
|
|
308
|
+
.transform((m) => ({
|
|
309
|
+
name: m.tool,
|
|
310
|
+
...(m.whenInput && { whenInput: m.whenInput }),
|
|
311
|
+
result: m.result,
|
|
312
|
+
}));
|
|
313
|
+
const TITLE_REQUIRED = "'title' is required: a short one-line label for the case (e.g. 'Unknown requester is rejected at entry')";
|
|
314
|
+
const DESCRIPTION_REQUIRED = "'description' is required: one or two sentences stating the scenario driven and what is asserted";
|
|
315
|
+
const documentSchema = z
|
|
316
|
+
.strictObject({
|
|
317
|
+
title: z.string({ error: TITLE_REQUIRED }),
|
|
318
|
+
description: z.string({ error: DESCRIPTION_REQUIRED }),
|
|
319
|
+
skip: z
|
|
320
|
+
.string({ error: "'skip' takes a reason string" })
|
|
321
|
+
.min(1, "'skip' takes a reason string")
|
|
322
|
+
.optional(),
|
|
323
|
+
trigger: z.strictObject({ id: z.string().min(1) }).optional(),
|
|
324
|
+
/** Case-level variable seeds, applied as the session's seeded `variables` (locked). */
|
|
325
|
+
variables: z
|
|
326
|
+
.record(z.string().regex(VARIABLE_NAME_PATTERN, {
|
|
327
|
+
error: "is not a valid variable name (lowercase letters, digits and underscores, starting with a letter)",
|
|
328
|
+
}), z.unknown())
|
|
329
|
+
.optional(),
|
|
330
|
+
workspace: z
|
|
331
|
+
.record(z.string().min(1, "workspace paths must be non-empty"), workspaceEntry)
|
|
332
|
+
.optional(),
|
|
333
|
+
mocks: z.array(mockSchema, { error: "'mocks' must be a list" }).optional(),
|
|
334
|
+
steps: z.array(stepSchema, { error: "'steps' must be a list" }).optional(),
|
|
335
|
+
})
|
|
336
|
+
.superRefine((doc, ctx) => {
|
|
337
|
+
const issue = (path, message) => ctx.addIssue({ code: "custom", path, message });
|
|
338
|
+
if (typeof doc.title === "string") {
|
|
339
|
+
if (doc.title.trim().length === 0)
|
|
340
|
+
issue([], TITLE_REQUIRED);
|
|
341
|
+
// Trimmed, so a `|` block holding one line is fine — only genuine multi-line prose is rejected.
|
|
342
|
+
else if (doc.title.trim().includes("\n"))
|
|
343
|
+
issue(["title"], "'title' is a single line — put the detail in 'description'");
|
|
344
|
+
else if (collapseWhitespace(doc.title).length > CASE_TITLE_MAX_LENGTH) {
|
|
345
|
+
issue(["title"], `'title' must be at most ${CASE_TITLE_MAX_LENGTH} characters (got ${collapseWhitespace(doc.title).length}) — ` +
|
|
346
|
+
"keep it a label; put the detail in 'description'");
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (typeof doc.description === "string") {
|
|
350
|
+
const length = collapseWhitespace(doc.description).length;
|
|
351
|
+
if (length === 0)
|
|
352
|
+
issue([], DESCRIPTION_REQUIRED);
|
|
353
|
+
else if (length > CASE_DESCRIPTION_MAX_LENGTH) {
|
|
354
|
+
issue(["description"], `'description' must be at most ${CASE_DESCRIPTION_MAX_LENGTH} characters (got ${length}) — ` +
|
|
355
|
+
"keep it to one or two sentences; longer rationale belongs in a YAML comment above the document");
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Assertions evaluate against the nearest action above them, so the first
|
|
359
|
+
// step that is not an action has nothing to evaluate against.
|
|
360
|
+
let hasAction = false;
|
|
361
|
+
for (const [i, step] of (doc.steps ?? []).entries()) {
|
|
362
|
+
if (!step || typeof step !== "object")
|
|
363
|
+
continue;
|
|
364
|
+
if (step.kind === "action")
|
|
365
|
+
hasAction = true;
|
|
366
|
+
else if (!hasAction) {
|
|
367
|
+
issue(["steps", i], `assertion '${step.expect.assert}' has no preceding action — put a 'send', 'decide', or 'deliver' step before it`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
const TOP_LEVEL_KEYS = Object.keys(documentSchema.shape);
|
|
372
|
+
/** Render a zod path the way the docs address steps: `steps[2].reply.includes[0]`. */
|
|
373
|
+
function renderPath(path) {
|
|
374
|
+
return path.reduce((acc, seg) => typeof seg === "number" ? `${acc}[${seg}]` : acc ? `${acc}.${String(seg)}` : String(seg), "");
|
|
375
|
+
}
|
|
376
|
+
function renderIssue(issue) {
|
|
377
|
+
const at = renderPath(issue.path);
|
|
378
|
+
const prefix = at ? `${at}: ` : "";
|
|
379
|
+
if (issue.code === "unrecognized_keys") {
|
|
380
|
+
const known = issue.path.length === 0 ? ` (known: ${TOP_LEVEL_KEYS.join(", ")})` : "";
|
|
381
|
+
return `${prefix}unknown key ${issue.keys.map((k) => `'${k}'`).join(", ")}${known}`;
|
|
382
|
+
}
|
|
383
|
+
// A record key that failed its own schema: say why, not "invalid key".
|
|
384
|
+
if (issue.code === "invalid_key")
|
|
385
|
+
return `${prefix}${issue.issues.map((i) => i.message).join("; ")}`;
|
|
386
|
+
return `${prefix}${issue.message}`;
|
|
387
|
+
}
|
|
388
|
+
/** Parse and validate one case document. Throws {@link CaseSchemaError} on any structural violation. */
|
|
389
|
+
export function parseCaseDocument(file, source, testsDir) {
|
|
390
|
+
let raw;
|
|
391
|
+
try {
|
|
392
|
+
raw = parseYaml(source);
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
throw new CaseSchemaError(file, null, `YAML parse error: ${err.message}`);
|
|
396
|
+
}
|
|
397
|
+
if (!isPlainObject(raw)) {
|
|
398
|
+
throw new CaseSchemaError(file, null, "a test case is a YAML mapping (title, description, steps, ...)");
|
|
399
|
+
}
|
|
400
|
+
const result = documentSchema.safeParse(raw);
|
|
401
|
+
if (!result.success) {
|
|
402
|
+
throw new CaseSchemaError(file, null, result.error.issues.map(renderIssue).join("; "));
|
|
403
|
+
}
|
|
404
|
+
const doc = result.data;
|
|
405
|
+
return {
|
|
406
|
+
file,
|
|
407
|
+
id: caseIdForFile(file, testsDir),
|
|
408
|
+
title: collapseWhitespace(doc.title),
|
|
409
|
+
description: collapseWhitespace(doc.description),
|
|
410
|
+
...(doc.skip !== undefined && { skip: doc.skip }),
|
|
411
|
+
...(doc.trigger !== undefined && { trigger: doc.trigger }),
|
|
412
|
+
...(doc.variables !== undefined && { variables: doc.variables }),
|
|
413
|
+
workspace: doc.workspace ?? {},
|
|
414
|
+
mocks: doc.mocks ?? [],
|
|
415
|
+
steps: doc.steps ?? [],
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
// ---------------------------------------------------------------------------
|
|
419
|
+
// The inverse: a document back to its YAML
|
|
420
|
+
/** A step as its YAML form: the single-key mapping the grammar reads. */
|
|
421
|
+
function serializeStep(step) {
|
|
422
|
+
if (step.kind === "action") {
|
|
423
|
+
const a = step.action;
|
|
424
|
+
switch (a.action) {
|
|
425
|
+
case "send":
|
|
426
|
+
return { send: a.message };
|
|
427
|
+
case "decide":
|
|
428
|
+
return { decide: { to: a.to, ...(a.comment !== undefined && { comment: a.comment }) } };
|
|
429
|
+
case "deliver":
|
|
430
|
+
return { deliver: { trigger: a.trigger, ...(a.variables && { variables: a.variables }) } };
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const e = step.expect;
|
|
434
|
+
const tokens = (list) => list.map((t) => t.raw);
|
|
435
|
+
switch (e.assert) {
|
|
436
|
+
case "succeeded":
|
|
437
|
+
case "usedNoTools":
|
|
438
|
+
case "noTraversal":
|
|
439
|
+
return { [e.assert]: true };
|
|
440
|
+
case "parked":
|
|
441
|
+
if (e.node)
|
|
442
|
+
return { parked: { ...(e.channel && { channel: e.channel }), node: e.node } };
|
|
443
|
+
return { parked: e.channel ?? true };
|
|
444
|
+
case "reachedState":
|
|
445
|
+
return { reachedState: e.state };
|
|
446
|
+
case "triggerArrival":
|
|
447
|
+
return { triggerArrival: e.trigger };
|
|
448
|
+
case "reply":
|
|
449
|
+
return {
|
|
450
|
+
reply: {
|
|
451
|
+
...(e.includes.length > 0 && { includes: tokens(e.includes) }),
|
|
452
|
+
...(e.excludes.length > 0 && { excludes: tokens(e.excludes) }),
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
case "calledTool":
|
|
456
|
+
case "notCalledTool":
|
|
457
|
+
case "blockedTool":
|
|
458
|
+
return { [e.assert]: { name: e.name, ...(e.input && { input: e.input }) } };
|
|
459
|
+
case "ranWorkflow":
|
|
460
|
+
return {
|
|
461
|
+
ranWorkflow: { workflow: e.workflow, status: e.status, ...(e.count !== undefined && { count: e.count }) },
|
|
462
|
+
};
|
|
463
|
+
case "trail":
|
|
464
|
+
return {
|
|
465
|
+
trail: {
|
|
466
|
+
...(e.to !== undefined && { to: e.to }),
|
|
467
|
+
...(e.stepKind !== undefined && { kind: e.stepKind }),
|
|
468
|
+
...(e.reason !== undefined && { reason: e.reason }),
|
|
469
|
+
count: e.count,
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
case "variables":
|
|
473
|
+
return {
|
|
474
|
+
variables: { expect: e.expect, ...(e.path && { path: e.path }), ...(e.locked && { locked: e.locked }) },
|
|
475
|
+
};
|
|
476
|
+
case "grade":
|
|
477
|
+
case "judge":
|
|
478
|
+
// `judge` is the deprecated alias; the document is written in the current spelling.
|
|
479
|
+
return { grade: { closedQA: e.closedQA, atLeast: e.atLeast } };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* The YAML of a {@link CaseDocument}: the inverse of {@link parseCaseDocument},
|
|
484
|
+
* in the grammar's own key order (`title`, `description`, `skip`, `trigger`,
|
|
485
|
+
* `variables`, `workspace`, `mocks`, `steps`), so an editor that parses a file,
|
|
486
|
+
* edits the document and writes it back changes only what it edited. `file` and
|
|
487
|
+
* `id` are the file's, not the document's, and are not written. A reply token
|
|
488
|
+
* keeps its `/pattern/flags` spelling; a `judge` step is written as `grade`.
|
|
489
|
+
* Comments are not part of the document and are not preserved — a host that
|
|
490
|
+
* keeps a leading comment re-attaches it. Holds `parse(serialize(doc))` deep-equal
|
|
491
|
+
* to `doc` for every document the grammar accepts.
|
|
492
|
+
*/
|
|
493
|
+
export function serializeCaseDocument(doc) {
|
|
494
|
+
const out = {
|
|
495
|
+
title: doc.title,
|
|
496
|
+
description: doc.description,
|
|
497
|
+
...(doc.skip !== undefined && { skip: doc.skip }),
|
|
498
|
+
...(doc.trigger !== undefined && { trigger: { id: doc.trigger.id } }),
|
|
499
|
+
...(doc.variables !== undefined && { variables: doc.variables }),
|
|
500
|
+
};
|
|
501
|
+
if (Object.keys(doc.workspace).length > 0) {
|
|
502
|
+
out.workspace = Object.fromEntries(Object.entries(doc.workspace).map(([path, entry]) => [
|
|
503
|
+
path,
|
|
504
|
+
entry.source === "file" ? { from: entry.from } : entry.content,
|
|
505
|
+
]));
|
|
506
|
+
}
|
|
507
|
+
if (doc.mocks.length > 0) {
|
|
508
|
+
out.mocks = doc.mocks.map((m) => ({
|
|
509
|
+
tool: m.name,
|
|
510
|
+
...(m.whenInput && { whenInput: m.whenInput }),
|
|
511
|
+
result: m.result,
|
|
512
|
+
}));
|
|
513
|
+
}
|
|
514
|
+
if (doc.steps.length > 0)
|
|
515
|
+
out.steps = doc.steps.map(serializeStep);
|
|
516
|
+
// No line folding: a long `send` stays one line, as an author would write it.
|
|
517
|
+
return stringifyYaml(out, { lineWidth: 0 });
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=case-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"case-schema.js","sourceRoot":"","sources":["../../src/testing/case-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Case discovery, shared by the runner and `validateWorkflow` so both see the
|
|
3
|
+
* same suite: every `*.test.yaml` / `*.test.yml` file beneath
|
|
4
|
+
* `workflows/<slug>/tests/`, recursively, sorted by path. Anything else in the
|
|
5
|
+
* directory — fixture files reached through `workspace: { from: … }`, notes, a
|
|
6
|
+
* leftover `*.test.js` — is not a case and is ignored without a diagnostic.
|
|
7
|
+
*/
|
|
8
|
+
import type { Workspace } from "../core/workspace.js";
|
|
9
|
+
/** List a suite's case files (workspace-relative). A missing directory is an empty suite. */
|
|
10
|
+
export declare function listCaseFiles(workspace: Workspace, testsDir: string): Promise<string[]>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { isTestFile } from "./case-schema.js";
|
|
2
|
+
/** List a suite's case files (workspace-relative). A missing directory is an empty suite. */
|
|
3
|
+
export async function listCaseFiles(workspace, testsDir) {
|
|
4
|
+
const files = [];
|
|
5
|
+
async function walk(current) {
|
|
6
|
+
let entries;
|
|
7
|
+
try {
|
|
8
|
+
entries = await workspace.listDir(current);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
const rel = entry.path.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
15
|
+
if (entry.is_dir)
|
|
16
|
+
await walk(rel);
|
|
17
|
+
else if (isTestFile(rel))
|
|
18
|
+
files.push(rel);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
await walk(testsDir);
|
|
22
|
+
return files.sort();
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/testing/discovery.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAoB,EAAE,QAAgB;IACxE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,UAAU,IAAI,CAAC,OAAe;QACjC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;iBAC7B,IAAI,UAAU,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
|