agentplane 0.3.13 → 0.3.14
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/assets/RUNNER.md +1 -1
- package/assets/agents/ORCHESTRATOR.json +1 -1
- package/assets/agents/SKILL_EXTRACTOR.json +31 -0
- package/assets/framework.manifest.json +7 -0
- package/assets/policy/incidents.md +5 -3
- package/assets/policy/workflow.branch_pr.md +10 -5
- package/dist/.build-manifest.json +278 -178
- package/dist/cli/output.d.ts +29 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +33 -0
- package/dist/cli/run-cli/command-catalog/core.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog/core.js +29 -87
- package/dist/cli/run-cli/command-catalog/lifecycle.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog/lifecycle.js +4 -12
- package/dist/cli/run-cli/command-catalog/project.d.ts +1 -1
- package/dist/cli/run-cli/command-catalog/project.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog/project.js +16 -38
- package/dist/cli/run-cli/command-catalog/shared.d.ts +9 -6
- package/dist/cli/run-cli/command-catalog/shared.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog/shared.js +23 -6
- package/dist/cli/run-cli/command-catalog/task.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog/task.js +6 -18
- package/dist/cli/run-cli/command-catalog.d.ts +1 -1
- package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/recipes.js +1 -0
- package/dist/cli/run-cli.js +1 -1
- package/dist/cli/run-cli.test-helpers.d.ts +1 -74
- package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
- package/dist/cli/run-cli.test-helpers.js +1 -769
- package/dist/commands/branch/cleanup-merged.d.ts.map +1 -1
- package/dist/commands/branch/cleanup-merged.js +5 -9
- package/dist/commands/branch/work-start.command.d.ts.map +1 -1
- package/dist/commands/branch/work-start.command.js +1 -0
- package/dist/commands/commit.spec.d.ts.map +1 -1
- package/dist/commands/commit.spec.js +2 -0
- package/dist/commands/doctor/branch-pr.d.ts +1 -1
- package/dist/commands/doctor/branch-pr.d.ts.map +1 -1
- package/dist/commands/doctor/branch-pr.js +5 -2
- package/dist/commands/guard/impl/commands.d.ts.map +1 -1
- package/dist/commands/guard/impl/commands.js +4 -1
- package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
- package/dist/commands/guard/impl/comment-commit.js +2 -1
- package/dist/commands/guard/impl/env.d.ts +6 -0
- package/dist/commands/guard/impl/env.d.ts.map +1 -1
- package/dist/commands/guard/impl/env.js +41 -0
- package/dist/commands/pr/internal/auto-commit.d.ts.map +1 -1
- package/dist/commands/pr/internal/auto-commit.js +2 -1
- package/dist/commands/pr/internal/sync-branch.d.ts +36 -0
- package/dist/commands/pr/internal/sync-branch.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-branch.js +113 -0
- package/dist/commands/pr/internal/sync-github.d.ts +28 -0
- package/dist/commands/pr/internal/sync-github.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-github.js +178 -0
- package/dist/commands/pr/internal/sync-model.d.ts +36 -0
- package/dist/commands/pr/internal/sync-model.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-model.js +1 -0
- package/dist/commands/pr/internal/sync-open-step.d.ts +10 -0
- package/dist/commands/pr/internal/sync-open-step.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-open-step.js +128 -0
- package/dist/commands/pr/internal/sync-support.d.ts +7 -0
- package/dist/commands/pr/internal/sync-support.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-support.js +29 -0
- package/dist/commands/pr/internal/sync-update-step.d.ts +6 -0
- package/dist/commands/pr/internal/sync-update-step.d.ts.map +1 -0
- package/dist/commands/pr/internal/sync-update-step.js +68 -0
- package/dist/commands/pr/internal/sync.d.ts +2 -6
- package/dist/commands/pr/internal/sync.d.ts.map +1 -1
- package/dist/commands/pr/internal/sync.js +83 -529
- package/dist/commands/pr/open.d.ts.map +1 -1
- package/dist/commands/pr/open.js +25 -8
- package/dist/commands/pr/pr.command.d.ts.map +1 -1
- package/dist/commands/pr/pr.command.js +7 -2
- package/dist/commands/recipes/impl/apply.d.ts +1 -1
- package/dist/commands/recipes/impl/apply.d.ts.map +1 -1
- package/dist/commands/recipes/impl/apply.js +1 -2
- package/dist/commands/recipes/impl/commands/active.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/active.js +6 -5
- package/dist/commands/recipes/impl/commands/add.d.ts +1 -0
- package/dist/commands/recipes/impl/commands/add.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/add.js +32 -27
- package/dist/commands/recipes/impl/commands/detach.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/detach.js +35 -21
- package/dist/commands/recipes/impl/commands/disable.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/disable.js +5 -3
- package/dist/commands/recipes/impl/commands/enable.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/enable.js +5 -3
- package/dist/commands/recipes/impl/commands/explain.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/explain.js +57 -47
- package/dist/commands/recipes/impl/commands/info.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/info.js +25 -21
- package/dist/commands/recipes/impl/commands/install.d.ts +1 -1
- package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/install.js +3 -13
- package/dist/commands/recipes/impl/commands/list-remote.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/list-remote.js +2 -3
- package/dist/commands/recipes/impl/commands/list.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/list.js +7 -6
- package/dist/commands/recipes/impl/commands/remove.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/remove.js +12 -7
- package/dist/commands/recipes/impl/commands/update.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/update.js +38 -24
- package/dist/commands/recipes/impl/index.d.ts +1 -1
- package/dist/commands/recipes/impl/index.d.ts.map +1 -1
- package/dist/commands/recipes/impl/installed-recipes.d.ts +1 -1
- package/dist/commands/recipes/impl/installed-recipes.d.ts.map +1 -1
- package/dist/commands/recipes/impl/installed-recipes.js +1 -2
- package/dist/commands/recipes/impl/mutation-transaction.d.ts +7 -0
- package/dist/commands/recipes/impl/mutation-transaction.d.ts.map +1 -0
- package/dist/commands/recipes/impl/mutation-transaction.js +47 -0
- package/dist/commands/recipes/impl/overlay-project.d.ts +19 -3
- package/dist/commands/recipes/impl/overlay-project.d.ts.map +1 -1
- package/dist/commands/recipes/impl/overlay-project.js +76 -38
- package/dist/commands/recipes/impl/paths.d.ts +0 -3
- package/dist/commands/recipes/impl/paths.d.ts.map +1 -1
- package/dist/commands/recipes/impl/paths.js +0 -3
- package/dist/commands/recipes/impl/project-installed-recipes.d.ts +4 -1
- package/dist/commands/recipes/impl/project-installed-recipes.d.ts.map +1 -1
- package/dist/commands/recipes/impl/project-installed-recipes.js +6 -4
- package/dist/commands/recipes/impl/project-recipe-state.d.ts +1 -1
- package/dist/commands/recipes/impl/project-recipe-state.d.ts.map +1 -1
- package/dist/commands/recipes/impl/project-registry.d.ts +5 -1
- package/dist/commands/recipes/impl/project-registry.d.ts.map +1 -1
- package/dist/commands/recipes/impl/project-registry.js +34 -14
- package/dist/commands/recipes/impl/resolver.d.ts +1 -1
- package/dist/commands/recipes/impl/resolver.d.ts.map +1 -1
- package/dist/commands/recipes/impl/resolver.js +1 -1
- package/dist/commands/recipes/impl/types.d.ts +1 -1
- package/dist/commands/recipes/impl/types.d.ts.map +1 -1
- package/dist/commands/recipes/impl/version.d.ts +5 -0
- package/dist/commands/recipes/impl/version.d.ts.map +1 -0
- package/dist/commands/recipes/impl/version.js +9 -0
- package/dist/commands/recipes.d.ts +5 -4
- package/dist/commands/recipes.d.ts.map +1 -1
- package/dist/commands/recipes.js +3 -3
- package/dist/commands/release/apply.command.d.ts +1 -1
- package/dist/commands/release/apply.command.d.ts.map +1 -1
- package/dist/commands/release/apply.command.js +15 -379
- package/dist/commands/release/apply.mutation.d.ts +1 -0
- package/dist/commands/release/apply.mutation.d.ts.map +1 -1
- package/dist/commands/release/apply.mutation.js +24 -1
- package/dist/commands/release/apply.pipeline.d.ts +22 -0
- package/dist/commands/release/apply.pipeline.d.ts.map +1 -0
- package/dist/commands/release/apply.pipeline.js +371 -0
- package/dist/commands/release/apply.preflight.d.ts +2 -0
- package/dist/commands/release/apply.preflight.d.ts.map +1 -1
- package/dist/commands/release/apply.preflight.js +13 -4
- package/dist/commands/release/apply.types.d.ts +27 -0
- package/dist/commands/release/apply.types.d.ts.map +1 -1
- package/dist/commands/release.test-helpers.d.ts +4 -0
- package/dist/commands/release.test-helpers.d.ts.map +1 -1
- package/dist/commands/release.test-helpers.js +7 -0
- package/dist/commands/shared/reconcile-check.d.ts.map +1 -1
- package/dist/commands/shared/reconcile-check.js +2 -2
- package/dist/commands/shared/task-backend.d.ts +6 -1
- package/dist/commands/shared/task-backend.d.ts.map +1 -1
- package/dist/commands/shared/task-backend.js +34 -2
- package/dist/commands/shared/task-mutation.d.ts.map +1 -1
- package/dist/commands/shared/task-mutation.js +4 -4
- package/dist/commands/shared/task-store/intents.d.ts +34 -0
- package/dist/commands/shared/task-store/intents.d.ts.map +1 -0
- package/dist/commands/shared/task-store/intents.js +265 -0
- package/dist/commands/shared/task-store/readme.d.ts +28 -0
- package/dist/commands/shared/task-store/readme.d.ts.map +1 -0
- package/dist/commands/shared/task-store/readme.js +125 -0
- package/dist/commands/shared/task-store/store.d.ts +26 -0
- package/dist/commands/shared/task-store/store.d.ts.map +1 -0
- package/dist/commands/shared/task-store/store.js +105 -0
- package/dist/commands/shared/task-store/types.d.ts +94 -0
- package/dist/commands/shared/task-store/types.d.ts.map +1 -0
- package/dist/commands/shared/task-store/types.js +1 -0
- package/dist/commands/shared/task-store.d.ts +3 -109
- package/dist/commands/shared/task-store.d.ts.map +1 -1
- package/dist/commands/shared/task-store.js +2 -493
- package/dist/commands/task/block.d.ts.map +1 -1
- package/dist/commands/task/block.js +7 -2
- package/dist/commands/task/comment.d.ts.map +1 -1
- package/dist/commands/task/comment.js +7 -2
- package/dist/commands/task/finish-shared.d.ts.map +1 -1
- package/dist/commands/task/finish-shared.js +3 -3
- package/dist/commands/task/finish.d.ts.map +1 -1
- package/dist/commands/task/finish.js +102 -15
- package/dist/commands/task/hosted-merge-sync.d.ts.map +1 -1
- package/dist/commands/task/hosted-merge-sync.js +9 -4
- package/dist/commands/task/list.run.d.ts.map +1 -1
- package/dist/commands/task/list.run.js +14 -4
- package/dist/commands/task/new.command.d.ts.map +1 -1
- package/dist/commands/task/new.command.js +16 -2
- package/dist/commands/task/new.js +2 -2
- package/dist/commands/task/show.d.ts.map +1 -1
- package/dist/commands/task/show.js +3 -3
- package/dist/commands/task/update.d.ts.map +1 -1
- package/dist/commands/task/update.js +11 -3
- package/dist/runner/adapters/codex.d.ts.map +1 -1
- package/dist/runner/adapters/codex.js +3 -33
- package/dist/runner/adapters/custom.d.ts.map +1 -1
- package/dist/runner/adapters/custom.js +3 -30
- package/dist/runner/adapters/runtime-shared.d.ts +14 -0
- package/dist/runner/adapters/runtime-shared.d.ts.map +1 -0
- package/dist/runner/adapters/runtime-shared.js +36 -0
- package/dist/runner/context/base-prompt-sources.d.ts +30 -0
- package/dist/runner/context/base-prompt-sources.d.ts.map +1 -0
- package/dist/runner/context/base-prompt-sources.js +144 -0
- package/dist/runner/context/base-prompts.d.ts +3 -22
- package/dist/runner/context/base-prompts.d.ts.map +1 -1
- package/dist/runner/context/base-prompts.js +6 -450
- package/dist/runner/context/overlay-prompt-blocks.d.ts +7 -0
- package/dist/runner/context/overlay-prompt-blocks.d.ts.map +1 -0
- package/dist/runner/context/overlay-prompt-blocks.js +72 -0
- package/dist/runner/context/prompt-block-shared.d.ts +54 -0
- package/dist/runner/context/prompt-block-shared.d.ts.map +1 -0
- package/dist/runner/context/prompt-block-shared.js +106 -0
- package/dist/runner/context/recipe-context.d.ts +2 -1
- package/dist/runner/context/recipe-context.d.ts.map +1 -1
- package/dist/runner/context/recipe-context.js +2 -1
- package/dist/runner/context/recipe-prompt-blocks.d.ts +6 -0
- package/dist/runner/context/recipe-prompt-blocks.d.ts.map +1 -0
- package/dist/runner/context/recipe-prompt-blocks.js +143 -0
- package/dist/runner/usecases/scenario-materialize-task.js +2 -2
- package/dist/runner/usecases/task-run-inspect.js +2 -2
- package/dist/runner/usecases/task-run-lifecycle-shared.js +2 -2
- package/dist/runner/usecases/task-run.d.ts.map +1 -1
- package/dist/runner/usecases/task-run.js +4 -2
- package/dist/runtime/capabilities/recipe.d.ts +1 -1
- package/dist/runtime/capabilities/recipe.d.ts.map +1 -1
- package/dist/runtime/execution-context.d.ts +63 -0
- package/dist/runtime/execution-context.d.ts.map +1 -0
- package/dist/{usecases/context/resolve-context.js → runtime/execution-context.js} +23 -26
- package/dist/runtime/incidents/advice-strategy.d.ts +15 -0
- package/dist/runtime/incidents/advice-strategy.d.ts.map +1 -0
- package/dist/runtime/incidents/advice-strategy.js +54 -0
- package/dist/runtime/incidents/plan-strategy.d.ts +9 -0
- package/dist/runtime/incidents/plan-strategy.d.ts.map +1 -0
- package/dist/runtime/incidents/plan-strategy.js +205 -0
- package/dist/runtime/incidents/registry-strategy.d.ts +6 -0
- package/dist/runtime/incidents/registry-strategy.d.ts.map +1 -0
- package/dist/runtime/incidents/registry-strategy.js +280 -0
- package/dist/runtime/incidents/resolve.d.ts +3 -25
- package/dist/runtime/incidents/resolve.d.ts.map +1 -1
- package/dist/runtime/incidents/resolve.js +3 -683
- package/dist/runtime/incidents/shared.d.ts +34 -0
- package/dist/runtime/incidents/shared.d.ts.map +1 -0
- package/dist/runtime/incidents/shared.js +171 -0
- package/dist/testing/cli-harness/recipe-archives.d.ts +28 -0
- package/dist/testing/cli-harness/recipe-archives.d.ts.map +1 -0
- package/dist/testing/cli-harness/recipe-archives.js +374 -0
- package/dist/testing/cli-harness/stdio.d.ts +26 -0
- package/dist/testing/cli-harness/stdio.d.ts.map +1 -0
- package/dist/testing/cli-harness/stdio.js +84 -0
- package/dist/testing/cli-harness.d.ts +25 -0
- package/dist/testing/cli-harness.d.ts.map +1 -0
- package/dist/testing/cli-harness.js +313 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +1 -0
- package/package.json +7 -4
- package/dist/commands/recipes/impl/manifest.d.ts +0 -4
- package/dist/commands/recipes/impl/manifest.d.ts.map +0 -1
- package/dist/commands/recipes/impl/manifest.js +0 -7
- package/dist/commands/recipes/impl/normalize.d.ts +0 -8
- package/dist/commands/recipes/impl/normalize.d.ts.map +0 -1
- package/dist/commands/recipes/impl/normalize.js +0 -54
- package/dist/commands/recipes/impl/scenario.d.ts +0 -16
- package/dist/commands/recipes/impl/scenario.d.ts.map +0 -1
- package/dist/commands/recipes/impl/scenario.js +0 -262
- package/dist/recipes/bundled-recipes.d.ts +0 -17
- package/dist/recipes/bundled-recipes.d.ts.map +0 -1
- package/dist/recipes/bundled-recipes.js +0 -15
- package/dist/usecases/context/resolve-context.d.ts +0 -68
- package/dist/usecases/context/resolve-context.d.ts.map +0 -1
- package/dist/usecases/task/task-list-usecase.d.ts +0 -9
- package/dist/usecases/task/task-list-usecase.d.ts.map +0 -1
- package/dist/usecases/task/task-list-usecase.js +0 -17
- package/dist/usecases/task/task-new-usecase.d.ts +0 -9
- package/dist/usecases/task/task-new-usecase.d.ts.map +0 -1
- package/dist/usecases/task/task-new-usecase.js +0 -17
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { matchOverlayWhen } from "@agentplaneorg/recipes";
|
|
3
|
+
import { fileExists } from "../../cli/fs-utils.js";
|
|
4
|
+
import { readProjectOverlayBundle } from "../../commands/recipes.js";
|
|
5
|
+
import { normalizeText, OVERLAY_PROMPT_PRIORITIES } from "./prompt-block-shared.js";
|
|
6
|
+
async function detectRepoTypes(gitRoot) {
|
|
7
|
+
const repoTypes = ["generic"];
|
|
8
|
+
const checks = [
|
|
9
|
+
["package.json", "node"],
|
|
10
|
+
["pyproject.toml", "python"],
|
|
11
|
+
["go.mod", "go"],
|
|
12
|
+
["Cargo.toml", "rust"],
|
|
13
|
+
];
|
|
14
|
+
for (const [relativePath, repoType] of checks) {
|
|
15
|
+
if (await fileExists(path.join(gitRoot, relativePath)))
|
|
16
|
+
repoTypes.push(repoType);
|
|
17
|
+
}
|
|
18
|
+
return [...new Set(repoTypes)].toSorted();
|
|
19
|
+
}
|
|
20
|
+
function inferTaskKind(task) {
|
|
21
|
+
const tags = Array.isArray(task?.data.tags)
|
|
22
|
+
? task.data.tags.filter((tag) => typeof tag === "string")
|
|
23
|
+
: [];
|
|
24
|
+
if (tags.includes("docs"))
|
|
25
|
+
return "docs";
|
|
26
|
+
if (tags.includes("refactor"))
|
|
27
|
+
return "refactor";
|
|
28
|
+
if (tags.includes("research"))
|
|
29
|
+
return "research";
|
|
30
|
+
if (tags.includes("bug") || tags.includes("bugfix"))
|
|
31
|
+
return "bugfix";
|
|
32
|
+
if (tags.length > 0)
|
|
33
|
+
return "feature";
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
export async function collectOverlayPromptBlocks(opts) {
|
|
37
|
+
const bundle = await readProjectOverlayBundle({
|
|
38
|
+
agentplaneDir: path.join(opts.git_root, ".agentplane"),
|
|
39
|
+
});
|
|
40
|
+
if (!bundle)
|
|
41
|
+
return [];
|
|
42
|
+
const repoTypes = await detectRepoTypes(opts.git_root);
|
|
43
|
+
const tags = Array.isArray(opts.task?.data.tags)
|
|
44
|
+
? opts.task.data.tags.filter((tag) => typeof tag === "string")
|
|
45
|
+
: [];
|
|
46
|
+
const taskKind = inferTaskKind(opts.task);
|
|
47
|
+
const blocks = [];
|
|
48
|
+
for (const [surface, fragments] of Object.entries(bundle.surfaces)) {
|
|
49
|
+
for (const fragment of fragments) {
|
|
50
|
+
if (!matchOverlayWhen(fragment.when, {
|
|
51
|
+
task_kind: taskKind,
|
|
52
|
+
command: opts.command,
|
|
53
|
+
tags,
|
|
54
|
+
repo_types: repoTypes,
|
|
55
|
+
})) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
blocks.push({
|
|
59
|
+
id: `overlay.${fragment.recipe_id}.${fragment.id}`,
|
|
60
|
+
role: fragment.strength === "required" ? "policy" : "context",
|
|
61
|
+
title: `${fragment.recipe_name}: ${fragment.id}`,
|
|
62
|
+
source: fragment.source,
|
|
63
|
+
priority: OVERLAY_PROMPT_PRIORITIES[surface] +
|
|
64
|
+
(fragment.order ?? 0),
|
|
65
|
+
surface: surface,
|
|
66
|
+
strength: fragment.strength,
|
|
67
|
+
content: normalizeText(fragment.content),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return blocks;
|
|
72
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type BehaviorCandidate, type ResolvedBehavior } from "../../runtime/behavior/index.js";
|
|
2
|
+
import type { RunnerPromptBlock, RunnerPromptRole } from "../types.js";
|
|
3
|
+
export declare const FRAMEWORK_RUNNER_PROMPT_URL: import("node:url").URL;
|
|
4
|
+
export declare const BASE_PROMPT_PRIORITIES: {
|
|
5
|
+
readonly framework_runner: 100;
|
|
6
|
+
readonly policy_gateway: 200;
|
|
7
|
+
readonly execution_profile: 250;
|
|
8
|
+
readonly owner_profile: 300;
|
|
9
|
+
readonly recipe_execution_context: 400;
|
|
10
|
+
readonly recipe_agent_profile: 500;
|
|
11
|
+
readonly recipe_skill_context: 600;
|
|
12
|
+
readonly recipe_tools_context: 700;
|
|
13
|
+
};
|
|
14
|
+
export declare const OVERLAY_PROMPT_PRIORITIES: {
|
|
15
|
+
readonly planning: 410;
|
|
16
|
+
readonly execution: 420;
|
|
17
|
+
readonly coding: 430;
|
|
18
|
+
readonly debugging: 440;
|
|
19
|
+
readonly review: 450;
|
|
20
|
+
readonly verification: 460;
|
|
21
|
+
readonly docs: 470;
|
|
22
|
+
readonly finish: 480;
|
|
23
|
+
};
|
|
24
|
+
export declare function ensureTrailingNewline(text: string): string;
|
|
25
|
+
export declare function normalizeOwnerId(ownerIdRaw: string): string;
|
|
26
|
+
export declare function normalizeText(text: string): string;
|
|
27
|
+
export declare function validateJsonPrompt(source: string, text: string): string;
|
|
28
|
+
export declare function renderRecipePromptJson(value: Record<string, unknown> | Record<string, unknown>[]): string;
|
|
29
|
+
export declare function toPromptSource(gitRoot: string, absPath: string): string;
|
|
30
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
31
|
+
export declare function readOptionalStringArray(value: unknown): string[];
|
|
32
|
+
export type PromptSourcePayload = {
|
|
33
|
+
source: string;
|
|
34
|
+
title: string;
|
|
35
|
+
content: string;
|
|
36
|
+
};
|
|
37
|
+
export type PromptSourceTraceMetadata = {
|
|
38
|
+
title: string;
|
|
39
|
+
};
|
|
40
|
+
export type ResolvedPromptSource = ResolvedBehavior<PromptSourcePayload, PromptSourceTraceMetadata>;
|
|
41
|
+
export declare function promptCandidate(opts: {
|
|
42
|
+
layer: BehaviorCandidate<PromptSourcePayload, PromptSourceTraceMetadata>["layer"];
|
|
43
|
+
source: string;
|
|
44
|
+
value: PromptSourcePayload;
|
|
45
|
+
order?: number;
|
|
46
|
+
}): BehaviorCandidate<PromptSourcePayload, PromptSourceTraceMetadata>;
|
|
47
|
+
export declare function promptBlockFromResolved(opts: {
|
|
48
|
+
id: string;
|
|
49
|
+
role: RunnerPromptRole;
|
|
50
|
+
priority: number;
|
|
51
|
+
resolved: ResolvedPromptSource;
|
|
52
|
+
}): RunnerPromptBlock;
|
|
53
|
+
export declare function loadFrameworkRunnerPrompt(): Promise<RunnerPromptBlock>;
|
|
54
|
+
//# sourceMappingURL=prompt-block-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-block-shared.d.ts","sourceRoot":"","sources":["../../../src/runner/context/prompt-block-shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvE,eAAO,MAAM,2BAA2B,wBAAwD,CAAC;AAEjG,eAAO,MAAM,sBAAsB;;;;;;;;;CASzB,CAAC;AAEX,eAAO,MAAM,yBAAyB;;;;;;;;;CAS5B,CAAC;AAEX,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWvE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACzD,MAAM,CAER;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAIhE;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;AAEpG,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAUpE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,GAAG,iBAAiB,CAUpB;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAsB5E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolveBehavior, stripBehaviorValue, } from "../../runtime/behavior/index.js";
|
|
3
|
+
export const FRAMEWORK_RUNNER_PROMPT_URL = new URL("../../../assets/RUNNER.md", import.meta.url);
|
|
4
|
+
export const BASE_PROMPT_PRIORITIES = {
|
|
5
|
+
framework_runner: 100,
|
|
6
|
+
policy_gateway: 200,
|
|
7
|
+
execution_profile: 250,
|
|
8
|
+
owner_profile: 300,
|
|
9
|
+
recipe_execution_context: 400,
|
|
10
|
+
recipe_agent_profile: 500,
|
|
11
|
+
recipe_skill_context: 600,
|
|
12
|
+
recipe_tools_context: 700,
|
|
13
|
+
};
|
|
14
|
+
export const OVERLAY_PROMPT_PRIORITIES = {
|
|
15
|
+
planning: 410,
|
|
16
|
+
execution: 420,
|
|
17
|
+
coding: 430,
|
|
18
|
+
debugging: 440,
|
|
19
|
+
review: 450,
|
|
20
|
+
verification: 460,
|
|
21
|
+
docs: 470,
|
|
22
|
+
finish: 480,
|
|
23
|
+
};
|
|
24
|
+
export function ensureTrailingNewline(text) {
|
|
25
|
+
return text.endsWith("\n") ? text : `${text}\n`;
|
|
26
|
+
}
|
|
27
|
+
export function normalizeOwnerId(ownerIdRaw) {
|
|
28
|
+
const trimmed = ownerIdRaw.trim();
|
|
29
|
+
if (!trimmed)
|
|
30
|
+
throw new Error("Runner base prompt collection requires a non-empty owner id.");
|
|
31
|
+
return trimmed.toUpperCase();
|
|
32
|
+
}
|
|
33
|
+
export function normalizeText(text) {
|
|
34
|
+
return ensureTrailingNewline(text.trimEnd());
|
|
35
|
+
}
|
|
36
|
+
export function validateJsonPrompt(source, text) {
|
|
37
|
+
let parsed;
|
|
38
|
+
try {
|
|
39
|
+
parsed = JSON.parse(text);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`Invalid prompt JSON: ${source} (malformed JSON)`);
|
|
43
|
+
}
|
|
44
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
45
|
+
throw new Error(`Invalid prompt JSON: ${source} (expected object)`);
|
|
46
|
+
}
|
|
47
|
+
return normalizeText(text);
|
|
48
|
+
}
|
|
49
|
+
export function renderRecipePromptJson(value) {
|
|
50
|
+
return normalizeText(JSON.stringify(value, null, 2));
|
|
51
|
+
}
|
|
52
|
+
export function toPromptSource(gitRoot, absPath) {
|
|
53
|
+
return absPath.replace(`${gitRoot}/`, "").replaceAll("\\", "/");
|
|
54
|
+
}
|
|
55
|
+
export function isRecord(value) {
|
|
56
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
57
|
+
}
|
|
58
|
+
export function readOptionalStringArray(value) {
|
|
59
|
+
return Array.isArray(value)
|
|
60
|
+
? value.filter((entry) => typeof entry === "string")
|
|
61
|
+
: [];
|
|
62
|
+
}
|
|
63
|
+
export function promptCandidate(opts) {
|
|
64
|
+
return {
|
|
65
|
+
layer: opts.layer,
|
|
66
|
+
source: opts.source,
|
|
67
|
+
value: opts.value,
|
|
68
|
+
order: opts.order,
|
|
69
|
+
metadata: {
|
|
70
|
+
title: opts.value.title,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function promptBlockFromResolved(opts) {
|
|
75
|
+
return {
|
|
76
|
+
id: opts.id,
|
|
77
|
+
role: opts.role,
|
|
78
|
+
title: opts.resolved.value.title,
|
|
79
|
+
source: opts.resolved.value.source,
|
|
80
|
+
priority: opts.priority,
|
|
81
|
+
content: opts.resolved.value.content,
|
|
82
|
+
resolution: stripBehaviorValue(opts.resolved),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export async function loadFrameworkRunnerPrompt() {
|
|
86
|
+
const resolved = resolveBehavior({
|
|
87
|
+
key: "runner.framework_prompt",
|
|
88
|
+
candidates: [
|
|
89
|
+
promptCandidate({
|
|
90
|
+
layer: "builtin",
|
|
91
|
+
source: "bundled:runner-prompt:RUNNER.md",
|
|
92
|
+
value: {
|
|
93
|
+
source: "bundled:runner-prompt:RUNNER.md",
|
|
94
|
+
title: "Framework Runner Prompt",
|
|
95
|
+
content: normalizeText(await readFile(FRAMEWORK_RUNNER_PROMPT_URL, "utf8")),
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
return promptBlockFromResolved({
|
|
101
|
+
id: "base.framework_runner",
|
|
102
|
+
role: "system",
|
|
103
|
+
priority: BASE_PROMPT_PRIORITIES.framework_runner,
|
|
104
|
+
resolved,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ResolvedProject } from "@agentplaneorg/core";
|
|
2
|
-
import {
|
|
2
|
+
import { type ResolvedRecipeScenarioSelection, type ScenarioDefinition } from "@agentplaneorg/recipes";
|
|
3
|
+
import { readProjectInstalledRecipes } from "../../commands/recipes.js";
|
|
3
4
|
import type { RunnerRecipeContext } from "../types.js";
|
|
4
5
|
type InstalledRecipeEntry = Awaited<ReturnType<typeof readProjectInstalledRecipes>>["recipes"][number];
|
|
5
6
|
export type RunnerRecipeContextEnvelope = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe-context.d.ts","sourceRoot":"","sources":["../../../src/runner/context/recipe-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"recipe-context.d.ts","sourceRoot":"","sources":["../../../src/runner/context/recipe-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,2BAA2B,EAE5B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,KAAK,oBAAoB,GAAG,OAAO,CACjC,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAC/C,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,+BAA+B,CAAC;IAC3C,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAoEF,wBAAsB,2BAA2B,CAAC,IAAI,EAAE;IACtD,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA4BvC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readScenarioDefinition, } from "@agentplaneorg/recipes";
|
|
2
|
+
import { readProjectRecipeAssetRegistry, readProjectInstalledRecipes, resolveRecipeScenarioSelection, } from "../../commands/recipes.js";
|
|
2
3
|
import { resolveRecipeCapabilityRegistry } from "../../runtime/capabilities/index.js";
|
|
3
4
|
import { CliError } from "../../shared/errors.js";
|
|
4
5
|
function toRecipeContext(opts) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RunnerPromptBlock, RunnerRecipeContext } from "../types.js";
|
|
2
|
+
export declare function collectRecipePromptBlocks(opts: {
|
|
3
|
+
git_root: string;
|
|
4
|
+
recipe: RunnerRecipeContext;
|
|
5
|
+
}): Promise<RunnerPromptBlock[]>;
|
|
6
|
+
//# sourceMappingURL=recipe-prompt-blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-prompt-blocks.d.ts","sourceRoot":"","sources":["../../../src/runner/context/recipe-prompt-blocks.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAmF5F,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4F/B"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileExists } from "../../cli/fs-utils.js";
|
|
4
|
+
import { resolveBehavior } from "../../runtime/behavior/index.js";
|
|
5
|
+
import { BASE_PROMPT_PRIORITIES, isRecord, promptBlockFromResolved, promptCandidate, readOptionalStringArray, renderRecipePromptJson, toPromptSource, } from "./prompt-block-shared.js";
|
|
6
|
+
async function loadRecipePromptTextBlock(opts) {
|
|
7
|
+
const candidates = [];
|
|
8
|
+
const relativeFile = opts.relative_file?.trim();
|
|
9
|
+
if (relativeFile) {
|
|
10
|
+
const absPath = path.join(opts.recipe_dir, relativeFile);
|
|
11
|
+
if (await fileExists(absPath)) {
|
|
12
|
+
const source = toPromptSource(opts.git_root, absPath);
|
|
13
|
+
candidates.push(promptCandidate({
|
|
14
|
+
layer: "extension",
|
|
15
|
+
source,
|
|
16
|
+
value: {
|
|
17
|
+
source,
|
|
18
|
+
title: opts.title,
|
|
19
|
+
content: await readFile(absPath, "utf8"),
|
|
20
|
+
},
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (typeof opts.fallback_content === "string" && opts.fallback_content.trim().length > 0) {
|
|
25
|
+
candidates.push(promptCandidate({
|
|
26
|
+
layer: "extension",
|
|
27
|
+
source: opts.fallback_source,
|
|
28
|
+
value: {
|
|
29
|
+
source: opts.fallback_source,
|
|
30
|
+
title: opts.title,
|
|
31
|
+
content: opts.fallback_content,
|
|
32
|
+
},
|
|
33
|
+
order: 10,
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
else if (opts.fallback_payload) {
|
|
37
|
+
candidates.push(promptCandidate({
|
|
38
|
+
layer: "extension",
|
|
39
|
+
source: opts.fallback_source,
|
|
40
|
+
value: {
|
|
41
|
+
source: opts.fallback_source,
|
|
42
|
+
title: opts.title,
|
|
43
|
+
content: renderRecipePromptJson(opts.fallback_payload),
|
|
44
|
+
},
|
|
45
|
+
order: 10,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
const resolved = resolveBehavior({
|
|
49
|
+
key: opts.prompt_id,
|
|
50
|
+
candidates,
|
|
51
|
+
});
|
|
52
|
+
return promptBlockFromResolved({
|
|
53
|
+
id: opts.prompt_id,
|
|
54
|
+
role: opts.role,
|
|
55
|
+
priority: opts.priority,
|
|
56
|
+
resolved,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export async function collectRecipePromptBlocks(opts) {
|
|
60
|
+
const recipeDir = opts.recipe.recipe_dir?.trim();
|
|
61
|
+
if (!recipeDir)
|
|
62
|
+
return [];
|
|
63
|
+
const promptBlocks = [];
|
|
64
|
+
const scenario = isRecord(opts.recipe.scenario) ? opts.recipe.scenario : {};
|
|
65
|
+
const executionContext = {
|
|
66
|
+
recipe: {
|
|
67
|
+
id: opts.recipe.recipe_id,
|
|
68
|
+
name: opts.recipe.recipe_name ?? null,
|
|
69
|
+
version: opts.recipe.recipe_version ?? null,
|
|
70
|
+
scenario_id: opts.recipe.scenario_id,
|
|
71
|
+
scenario_file: opts.recipe.scenario_file ?? null,
|
|
72
|
+
},
|
|
73
|
+
selection_reasons: opts.recipe.selection_reasons ?? [],
|
|
74
|
+
run_profile: opts.recipe.run_profile ?? {},
|
|
75
|
+
scenario: {
|
|
76
|
+
summary: typeof scenario.summary === "string" ? scenario.summary : null,
|
|
77
|
+
description: typeof scenario.description === "string" ? scenario.description : null,
|
|
78
|
+
goal: typeof scenario.goal === "string" ? scenario.goal : null,
|
|
79
|
+
evidence: isRecord(scenario.evidence) ? scenario.evidence : null,
|
|
80
|
+
outputs: readOptionalStringArray(scenario.outputs),
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
promptBlocks.push({
|
|
84
|
+
id: "recipe.execution_context",
|
|
85
|
+
role: "context",
|
|
86
|
+
title: `Recipe Scenario Context (${opts.recipe.recipe_id}:${opts.recipe.scenario_id})`,
|
|
87
|
+
source: `recipe:${opts.recipe.recipe_id}:${opts.recipe.scenario_id}`,
|
|
88
|
+
priority: BASE_PROMPT_PRIORITIES.recipe_execution_context,
|
|
89
|
+
content: renderRecipePromptJson(executionContext),
|
|
90
|
+
});
|
|
91
|
+
const agentBlocks = await Promise.all((opts.recipe.agents ?? []).map(async (agent, index) => {
|
|
92
|
+
const agentId = typeof agent.id === "string" ? agent.id : `agent_${index + 1}`;
|
|
93
|
+
return loadRecipePromptTextBlock({
|
|
94
|
+
git_root: opts.git_root,
|
|
95
|
+
recipe_dir: recipeDir,
|
|
96
|
+
prompt_id: `recipe.agent.${agentId}`,
|
|
97
|
+
role: "profile",
|
|
98
|
+
title: `Recipe Agent Prompt (${agentId})`,
|
|
99
|
+
relative_file: typeof agent.file === "string" ? agent.file : undefined,
|
|
100
|
+
fallback_source: `recipe:${opts.recipe.recipe_id}:agent:${agentId}`,
|
|
101
|
+
fallback_content: typeof agent.content === "string" ? agent.content : undefined,
|
|
102
|
+
fallback_payload: agent,
|
|
103
|
+
priority: BASE_PROMPT_PRIORITIES.recipe_agent_profile + index,
|
|
104
|
+
});
|
|
105
|
+
}));
|
|
106
|
+
promptBlocks.push(...agentBlocks);
|
|
107
|
+
const skillBlocks = await Promise.all((opts.recipe.skills ?? []).map(async (skill, index) => {
|
|
108
|
+
const skillId = typeof skill.id === "string" ? skill.id : `skill_${index + 1}`;
|
|
109
|
+
return loadRecipePromptTextBlock({
|
|
110
|
+
git_root: opts.git_root,
|
|
111
|
+
recipe_dir: recipeDir,
|
|
112
|
+
prompt_id: `recipe.skill.${skillId}`,
|
|
113
|
+
role: "context",
|
|
114
|
+
title: `Recipe Skill Prompt (${skillId})`,
|
|
115
|
+
relative_file: typeof skill.file === "string" ? skill.file : undefined,
|
|
116
|
+
fallback_source: `recipe:${opts.recipe.recipe_id}:skill:${skillId}`,
|
|
117
|
+
fallback_content: typeof skill.content === "string" ? skill.content : undefined,
|
|
118
|
+
fallback_payload: skill,
|
|
119
|
+
priority: BASE_PROMPT_PRIORITIES.recipe_skill_context + index,
|
|
120
|
+
});
|
|
121
|
+
}));
|
|
122
|
+
promptBlocks.push(...skillBlocks);
|
|
123
|
+
if ((opts.recipe.tools ?? []).length > 0) {
|
|
124
|
+
const toolPayload = (opts.recipe.tools ?? []).map((tool) => ({
|
|
125
|
+
id: typeof tool.id === "string" ? tool.id : null,
|
|
126
|
+
summary: typeof tool.summary === "string" ? tool.summary : null,
|
|
127
|
+
runtime: typeof tool.runtime === "string" ? tool.runtime : null,
|
|
128
|
+
entrypoint: typeof tool.entrypoint === "string" ? tool.entrypoint : null,
|
|
129
|
+
permissions: readOptionalStringArray(tool.permissions),
|
|
130
|
+
timeout_ms: typeof tool.timeout_ms === "number" ? tool.timeout_ms : null,
|
|
131
|
+
cwd_policy: typeof tool.cwd_policy === "string" ? tool.cwd_policy : null,
|
|
132
|
+
}));
|
|
133
|
+
promptBlocks.push({
|
|
134
|
+
id: "recipe.tools_summary",
|
|
135
|
+
role: "context",
|
|
136
|
+
title: "Recipe Tool Context",
|
|
137
|
+
source: `recipe:${opts.recipe.recipe_id}:tools`,
|
|
138
|
+
priority: BASE_PROMPT_PRIORITIES.recipe_tools_context,
|
|
139
|
+
content: renderRecipePromptJson(toolPayload),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return promptBlocks;
|
|
143
|
+
}
|
|
@@ -5,7 +5,7 @@ import { TASK_DOC_VERSION_V3, buildDefaultVerifyStepsSection, defaultTaskDocV3,
|
|
|
5
5
|
import { createClarificationContract, createTaskGraphDraft, createTaskIntakeContext, materializeTaskGraphDraft, } from "../../runtime/task-intake/index.js";
|
|
6
6
|
import { buildTaskDocState } from "../../shared/task-doc-state.js";
|
|
7
7
|
import { dedupeStrings } from "../../shared/strings.js";
|
|
8
|
-
import {
|
|
8
|
+
import { makeReadOnlyExecutionContext } from "../../runtime/execution-context.js";
|
|
9
9
|
import { createRunnerRunId } from "../run-id.js";
|
|
10
10
|
import { assembleRunnerRecipeContext, } from "../context/recipe-context.js";
|
|
11
11
|
function nowIso() {
|
|
@@ -121,7 +121,7 @@ export function buildMaterializedRecipeTask(opts) {
|
|
|
121
121
|
export async function materializeRecipeScenarioTask(opts) {
|
|
122
122
|
const command = opts.ctx ??
|
|
123
123
|
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
124
|
-
const executionContext = await
|
|
124
|
+
const executionContext = await makeReadOnlyExecutionContext(command);
|
|
125
125
|
if (!executionContext.backend.task_backend.generateTaskId) {
|
|
126
126
|
throw new Error("Backend does not support task materialization: missing generateTaskId()");
|
|
127
127
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { loadCommandContext } from "../../commands/shared/task-backend.js";
|
|
2
2
|
import { CliError } from "../../shared/errors.js";
|
|
3
|
-
import {
|
|
3
|
+
import { makeReadOnlyExecutionContext } from "../../runtime/execution-context.js";
|
|
4
4
|
import { resolveLatestRunnerRunId, RunnerRunRepository } from "../run-repository.js";
|
|
5
5
|
import { resolveTaskRunnerPaths } from "../task-run-paths.js";
|
|
6
6
|
export async function loadTaskRunnerInspection(opts) {
|
|
7
7
|
const command = opts.ctx ??
|
|
8
8
|
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
9
|
-
const executionContext = await
|
|
9
|
+
const executionContext = await makeReadOnlyExecutionContext(command);
|
|
10
10
|
const task = await executionContext.backend.task_backend.getTask(opts.task_id);
|
|
11
11
|
if (!task) {
|
|
12
12
|
throw new CliError({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { loadCommandContext } from "../../commands/shared/task-backend.js";
|
|
3
3
|
import { CliError } from "../../shared/errors.js";
|
|
4
|
-
import {
|
|
4
|
+
import { makeReadOnlyExecutionContext } from "../../runtime/execution-context.js";
|
|
5
5
|
import { createRunnerAdapter } from "../adapters/index.js";
|
|
6
6
|
import { runnerAdapterCancelledResult } from "../adapters/shared.js";
|
|
7
7
|
import { evolveRunnerRunState } from "../artifacts.js";
|
|
@@ -142,7 +142,7 @@ export function buildSyntheticCancelledState(opts) {
|
|
|
142
142
|
export async function loadExistingRunnerExecution(opts) {
|
|
143
143
|
const command = opts.ctx ??
|
|
144
144
|
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
145
|
-
const executionContext = await
|
|
145
|
+
const executionContext = await makeReadOnlyExecutionContext(command);
|
|
146
146
|
if (opts.require_task_doing !== false) {
|
|
147
147
|
assertCurrentTaskDoing(opts.task_id, await executionContext.backend.task_backend.getTask(opts.task_id));
|
|
148
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-run.d.ts","sourceRoot":"","sources":["../../../src/runner/usecases/task-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuBhG,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,2BAA2B,GAAG;IACtE,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAkHF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAc5E;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,MAAM,CAiCR;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GAAG,OAAO,CAAC,2BAA2B,CAAC,
|
|
1
|
+
{"version":3,"file":"task-run.d.ts","sourceRoot":"","sources":["../../../src/runner/usecases/task-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuBhG,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,2BAA2B,GAAG;IACtE,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAkHF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAc5E;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,MAAM,CAiCR;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAuHvC;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAgDvC"}
|
|
@@ -5,7 +5,7 @@ import { resolveRunnerAdapterCapabilityRegistry } from "../../runtime/capabiliti
|
|
|
5
5
|
import { consumeExecutionProfileBudget } from "../../runtime/execution-profile/index.js";
|
|
6
6
|
import { appendFrameworkExplainBehaviorInputs, } from "../../runtime/explain/index.js";
|
|
7
7
|
import { buildFrameworkProtocolSurface } from "../../runtime/protocol/index.js";
|
|
8
|
-
import {
|
|
8
|
+
import { makeReadOnlyExecutionContext } from "../../runtime/execution-context.js";
|
|
9
9
|
import { evolveRunnerRunState } from "../artifacts.js";
|
|
10
10
|
import { createRunnerAdapter } from "../adapters/index.js";
|
|
11
11
|
import { readRecipeRunProfile } from "../adapters/recipe-run-profile.js";
|
|
@@ -166,7 +166,7 @@ export function renderTaskRunnerBootstrap(bundle, invocation) {
|
|
|
166
166
|
export async function prepareTaskRunnerExecution(opts) {
|
|
167
167
|
const command = opts.ctx ??
|
|
168
168
|
(await loadCommandContext({ cwd: opts.cwd, rootOverride: opts.rootOverride ?? null }));
|
|
169
|
-
const executionContext = await
|
|
169
|
+
const executionContext = await makeReadOnlyExecutionContext(command);
|
|
170
170
|
const target = opts.target ?? { kind: "task", task_id: opts.task_id };
|
|
171
171
|
void executionContext.policy.evaluate({
|
|
172
172
|
action: target.kind === "recipe_scenario" ? "scenario_execute" : "task_run",
|
|
@@ -184,11 +184,13 @@ export async function prepareTaskRunnerExecution(opts) {
|
|
|
184
184
|
rootOverride: opts.rootOverride ?? null,
|
|
185
185
|
task_id: opts.task_id,
|
|
186
186
|
});
|
|
187
|
+
const runnerCommand = target.kind === "recipe_scenario" ? "recipes scenario execute" : "task run";
|
|
187
188
|
const base_prompts = await collectRunnerBasePrompts({
|
|
188
189
|
git_root: executionContext.repo.git_root,
|
|
189
190
|
owner_id: taskEnvelope.task.data.owner,
|
|
190
191
|
agents_dir: executionContext.harness.workflow.paths.agents_dir,
|
|
191
192
|
task: taskEnvelope.task,
|
|
193
|
+
command: runnerCommand,
|
|
192
194
|
recipe: opts.recipe,
|
|
193
195
|
harness: executionContext.harness,
|
|
194
196
|
execution_profile: executionProfile,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CompiledRecipeAssetEntry, InstalledRecipeEntry, ResolvedRecipeScenarioSelection } from "
|
|
1
|
+
import type { CompiledRecipeAssetEntry, InstalledRecipeEntry, ResolvedRecipeScenarioSelection } from "@agentplaneorg/recipes";
|
|
2
2
|
import type { AgentplaneCapabilityRegistry } from "./types.js";
|
|
3
3
|
type RecipeSelection = Pick<ResolvedRecipeScenarioSelection, "scenario_id" | "agents_involved" | "skills_used" | "tools_used">;
|
|
4
4
|
type RecipeEntry = Pick<InstalledRecipeEntry, "id" | "version" | "manifest">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/runtime/capabilities/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,EAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../../src/runtime/capabilities/recipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,EAChC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAA6B,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE1F,KAAK,eAAe,GAAG,IAAI,CACzB,+BAA+B,EAC/B,aAAa,GAAG,iBAAiB,GAAG,aAAa,GAAG,YAAY,CACjE,CAAC;AAEF,KAAK,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAsG7E,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACpC,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACpC,GAAG,4BAA4B,CAiG/B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AgentplaneConfig, ResolvedProject } from "@agentplaneorg/core";
|
|
2
|
+
import type { Adapters } from "../adapters/index.js";
|
|
3
|
+
import { type CommandContext } from "../commands/shared/task-backend.js";
|
|
4
|
+
import { PolicyEngine } from "../policy/engine.js";
|
|
5
|
+
import { type ApprovalRuntime } from "./approvals/index.js";
|
|
6
|
+
import { type AgentplaneCapabilityRegistry } from "./capabilities/index.js";
|
|
7
|
+
import { type ResolvedExecutionProfileRuntime } from "./execution-profile/index.js";
|
|
8
|
+
import { type FrameworkExplainPayload } from "./explain/index.js";
|
|
9
|
+
import { type ResolvedHarnessContract } from "./harness/index.js";
|
|
10
|
+
import { type FrameworkProtocolSurface } from "./protocol/index.js";
|
|
11
|
+
import { type TaskIntakeRuntime } from "./task-intake/index.js";
|
|
12
|
+
export type AgentplaneRepositoryContext = {
|
|
13
|
+
git_root: string;
|
|
14
|
+
agentplane_dir: string;
|
|
15
|
+
workflow_dir: string;
|
|
16
|
+
};
|
|
17
|
+
export type AgentplaneBackendContext = {
|
|
18
|
+
id: string;
|
|
19
|
+
config_path: string;
|
|
20
|
+
capabilities: CommandContext["taskBackend"]["capabilities"] | null;
|
|
21
|
+
task_backend: CommandContext["taskBackend"];
|
|
22
|
+
};
|
|
23
|
+
export type ReadOnlyExecutionContext = {
|
|
24
|
+
command: CommandContext;
|
|
25
|
+
project: CommandContext["resolvedProject"];
|
|
26
|
+
repo: AgentplaneRepositoryContext;
|
|
27
|
+
config: CommandContext["config"];
|
|
28
|
+
backend: AgentplaneBackendContext;
|
|
29
|
+
harness: ResolvedHarnessContract;
|
|
30
|
+
capabilities: AgentplaneCapabilityRegistry;
|
|
31
|
+
execution: ResolvedHarnessContract["execution"];
|
|
32
|
+
executionProfile: ResolvedExecutionProfileRuntime;
|
|
33
|
+
taskIntake: TaskIntakeRuntime;
|
|
34
|
+
frameworkExplain: FrameworkExplainPayload;
|
|
35
|
+
frameworkProtocol: FrameworkProtocolSurface;
|
|
36
|
+
approvals: ResolvedHarnessContract["policy"]["approvals"];
|
|
37
|
+
policy: PolicyEngine;
|
|
38
|
+
approvalRuntime: ApprovalRuntime;
|
|
39
|
+
};
|
|
40
|
+
export type ExecutionContext = ReadOnlyExecutionContext & {
|
|
41
|
+
adapters: Adapters;
|
|
42
|
+
};
|
|
43
|
+
export declare function resolveCommandContext(opts: {
|
|
44
|
+
cwd: string;
|
|
45
|
+
rootOverride?: string | null;
|
|
46
|
+
resolvedProject?: ResolvedProject;
|
|
47
|
+
config?: AgentplaneConfig;
|
|
48
|
+
}): Promise<CommandContext>;
|
|
49
|
+
export declare function resolveReadOnlyExecutionContext(opts: {
|
|
50
|
+
cwd: string;
|
|
51
|
+
rootOverride?: string | null;
|
|
52
|
+
resolvedProject?: ResolvedProject;
|
|
53
|
+
config?: AgentplaneConfig;
|
|
54
|
+
}): Promise<ReadOnlyExecutionContext>;
|
|
55
|
+
export declare function resolveExecutionContext(opts: {
|
|
56
|
+
cwd: string;
|
|
57
|
+
rootOverride?: string | null;
|
|
58
|
+
resolvedProject?: ResolvedProject;
|
|
59
|
+
config?: AgentplaneConfig;
|
|
60
|
+
}): Promise<ExecutionContext>;
|
|
61
|
+
export declare function makeReadOnlyExecutionContext(command: CommandContext): Promise<ReadOnlyExecutionContext>;
|
|
62
|
+
export declare function makeExecutionContext(command: CommandContext): Promise<ExecutionContext>;
|
|
63
|
+
//# sourceMappingURL=execution-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-context.d.ts","sourceRoot":"","sources":["../../src/runtime/execution-context.ts"],"names":[],"mappings":"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"}
|