agentplane 0.2.24 → 0.2.26
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/bin/agentplane.js +91 -54
- package/dist/.build-manifest.json +11 -0
- package/dist/backends/task-backend/local-backend.d.ts +2 -0
- package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/local-backend.js +12 -1
- package/dist/backends/task-backend/redmine/mapping.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine/mapping.js +26 -1
- package/dist/backends/task-backend/redmine-backend.d.ts +4 -0
- package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine-backend.js +92 -9
- package/dist/backends/task-backend/shared/types.d.ts +1 -0
- package/dist/backends/task-backend/shared/types.d.ts.map +1 -1
- package/dist/backends/task-index.d.ts.map +1 -1
- package/dist/backends/task-index.js +8 -1
- package/dist/cli/command-guide.d.ts.map +1 -1
- package/dist/cli/command-guide.js +21 -8
- package/dist/cli/command-snippets.d.ts +24 -0
- package/dist/cli/command-snippets.d.ts.map +1 -0
- package/dist/cli/command-snippets.js +23 -0
- package/dist/cli/reason-codes.d.ts +9 -0
- package/dist/cli/reason-codes.d.ts.map +1 -0
- package/dist/cli/reason-codes.js +79 -0
- package/dist/cli/recipes-bundled.d.ts +1 -0
- package/dist/cli/recipes-bundled.d.ts.map +1 -1
- package/dist/cli/recipes-bundled.js +4 -1
- 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/command-catalog.js +40 -1
- package/dist/cli/run-cli/commands/config.d.ts +5 -0
- package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/config.js +86 -1
- package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/core.js +55 -0
- package/dist/cli/run-cli/commands/init/recipes.d.ts +5 -1
- package/dist/cli/run-cli/commands/init/recipes.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/recipes.js +24 -4
- package/dist/cli/run-cli/commands/init/write-workflow.d.ts +7 -0
- package/dist/cli/run-cli/commands/init/write-workflow.d.ts.map +1 -0
- package/dist/cli/run-cli/commands/init/write-workflow.js +52 -0
- package/dist/cli/run-cli/commands/init.d.ts +2 -1
- package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init.js +104 -54
- package/dist/cli/run-cli.d.ts.map +1 -1
- package/dist/cli/run-cli.js +70 -1
- package/dist/commands/backend/sync.command.d.ts.map +1 -1
- package/dist/commands/backend/sync.command.js +7 -6
- package/dist/commands/backend.d.ts.map +1 -1
- package/dist/commands/backend.js +2 -0
- package/dist/commands/block.spec.d.ts.map +1 -1
- package/dist/commands/block.spec.js +23 -2
- package/dist/commands/commit.spec.d.ts.map +1 -1
- package/dist/commands/commit.spec.js +18 -6
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +96 -10
- package/dist/commands/finish.spec.d.ts.map +1 -1
- package/dist/commands/finish.spec.js +53 -4
- package/dist/commands/guard/commit.command.d.ts.map +1 -1
- package/dist/commands/guard/commit.command.js +26 -20
- package/dist/commands/guard/impl/allow.d.ts.map +1 -1
- package/dist/commands/guard/impl/allow.js +8 -1
- package/dist/commands/guard/impl/commands.d.ts.map +1 -1
- package/dist/commands/guard/impl/commands.js +19 -21
- package/dist/commands/guard/impl/comment-commit.d.ts.map +1 -1
- package/dist/commands/guard/impl/comment-commit.js +8 -17
- package/dist/commands/recipes/impl/commands/install.d.ts.map +1 -1
- package/dist/commands/recipes/impl/commands/install.js +36 -13
- package/dist/commands/recipes/impl/scenario.d.ts.map +1 -1
- package/dist/commands/recipes/impl/scenario.js +25 -0
- package/dist/commands/recipes/impl/types.d.ts +4 -0
- package/dist/commands/recipes/impl/types.d.ts.map +1 -1
- package/dist/commands/scenario/impl/commands.d.ts.map +1 -1
- package/dist/commands/scenario/impl/commands.js +74 -3
- package/dist/commands/scenario/impl/report.d.ts +8 -0
- package/dist/commands/scenario/impl/report.d.ts.map +1 -1
- package/dist/commands/scenario/impl/report.js +1 -0
- package/dist/commands/shared/reconcile-check.d.ts +7 -0
- package/dist/commands/shared/reconcile-check.d.ts.map +1 -0
- package/dist/commands/shared/reconcile-check.js +60 -0
- package/dist/commands/start.spec.d.ts.map +1 -1
- package/dist/commands/start.spec.js +23 -2
- package/dist/commands/sync.command.d.ts.map +1 -1
- package/dist/commands/sync.command.js +9 -2
- package/dist/commands/task/finish.d.ts.map +1 -1
- package/dist/commands/task/finish.js +34 -10
- package/dist/commands/task/list.d.ts.map +1 -1
- package/dist/commands/task/list.js +2 -1
- package/dist/commands/task/list.spec.d.ts.map +1 -1
- package/dist/commands/task/list.spec.js +7 -0
- package/dist/commands/task/next.d.ts.map +1 -1
- package/dist/commands/task/next.js +2 -1
- package/dist/commands/task/next.spec.d.ts.map +1 -1
- package/dist/commands/task/next.spec.js +7 -0
- package/dist/commands/task/search.d.ts.map +1 -1
- package/dist/commands/task/search.js +2 -1
- package/dist/commands/task/search.spec.d.ts.map +1 -1
- package/dist/commands/task/search.spec.js +7 -0
- package/dist/commands/task/set-status.command.d.ts.map +1 -1
- package/dist/commands/task/set-status.command.js +22 -2
- package/dist/commands/task/shared.d.ts +7 -0
- package/dist/commands/task/shared.d.ts.map +1 -1
- package/dist/commands/task/shared.js +21 -1
- package/dist/commands/task/verify-record.d.ts.map +1 -1
- package/dist/commands/task/verify-record.js +2 -0
- package/dist/commands/workflow-build.command.d.ts +8 -0
- package/dist/commands/workflow-build.command.d.ts.map +1 -0
- package/dist/commands/workflow-build.command.js +96 -0
- package/dist/commands/workflow-playbook.command.d.ts +10 -0
- package/dist/commands/workflow-playbook.command.d.ts.map +1 -0
- package/dist/commands/workflow-playbook.command.js +174 -0
- package/dist/commands/workflow-restore.command.d.ts +5 -0
- package/dist/commands/workflow-restore.command.d.ts.map +1 -0
- package/dist/commands/workflow-restore.command.js +30 -0
- package/dist/commands/workflow.command.d.ts +6 -0
- package/dist/commands/workflow.command.d.ts.map +1 -0
- package/dist/commands/workflow.command.js +36 -0
- package/dist/harness/dynamic-tool-contract.d.ts +29 -0
- package/dist/harness/dynamic-tool-contract.d.ts.map +1 -0
- package/dist/harness/dynamic-tool-contract.js +86 -0
- package/dist/harness/hooks-lifecycle.d.ts +27 -0
- package/dist/harness/hooks-lifecycle.d.ts.map +1 -0
- package/dist/harness/hooks-lifecycle.js +67 -0
- package/dist/harness/index.d.ts +9 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +8 -0
- package/dist/harness/reconcile.d.ts +37 -0
- package/dist/harness/reconcile.d.ts.map +1 -0
- package/dist/harness/reconcile.js +42 -0
- package/dist/harness/retry-policy.d.ts +31 -0
- package/dist/harness/retry-policy.d.ts.map +1 -0
- package/dist/harness/retry-policy.js +33 -0
- package/dist/harness/scheduler.d.ts +18 -0
- package/dist/harness/scheduler.d.ts.map +1 -0
- package/dist/harness/scheduler.js +55 -0
- package/dist/harness/state-machine.d.ts +17 -0
- package/dist/harness/state-machine.d.ts.map +1 -0
- package/dist/harness/state-machine.js +70 -0
- package/dist/harness/token-accounting.d.ts +19 -0
- package/dist/harness/token-accounting.d.ts.map +1 -0
- package/dist/harness/token-accounting.js +77 -0
- package/dist/harness/workspace-safety.d.ts +14 -0
- package/dist/harness/workspace-safety.d.ts.map +1 -0
- package/dist/harness/workspace-safety.js +62 -0
- package/dist/policy/rules/allowlist.d.ts.map +1 -1
- package/dist/policy/rules/allowlist.js +9 -0
- package/dist/recipes/bundled-recipes.d.ts +4 -0
- package/dist/recipes/bundled-recipes.d.ts.map +1 -1
- package/dist/recipes/bundled-recipes.js +11 -0
- package/dist/shared/allow-prefix-policy.d.ts +3 -0
- package/dist/shared/allow-prefix-policy.d.ts.map +1 -0
- package/dist/shared/allow-prefix-policy.js +8 -0
- package/dist/shared/errors.d.ts +6 -0
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +1 -0
- package/dist/workflow-runtime/build.d.ts +4 -0
- package/dist/workflow-runtime/build.d.ts.map +1 -0
- package/dist/workflow-runtime/build.js +114 -0
- package/dist/workflow-runtime/enforcement.d.ts +3 -0
- package/dist/workflow-runtime/enforcement.d.ts.map +1 -0
- package/dist/workflow-runtime/enforcement.js +10 -0
- package/dist/workflow-runtime/file-ops.d.ts +11 -0
- package/dist/workflow-runtime/file-ops.d.ts.map +1 -0
- package/dist/workflow-runtime/file-ops.js +248 -0
- package/dist/workflow-runtime/fix.d.ts +9 -0
- package/dist/workflow-runtime/fix.d.ts.map +1 -0
- package/dist/workflow-runtime/fix.js +107 -0
- package/dist/workflow-runtime/index.d.ts +11 -0
- package/dist/workflow-runtime/index.d.ts.map +1 -0
- package/dist/workflow-runtime/index.js +10 -0
- package/dist/workflow-runtime/markdown.d.ts +10 -0
- package/dist/workflow-runtime/markdown.d.ts.map +1 -0
- package/dist/workflow-runtime/markdown.js +147 -0
- package/dist/workflow-runtime/observability.d.ts +12 -0
- package/dist/workflow-runtime/observability.d.ts.map +1 -0
- package/dist/workflow-runtime/observability.js +14 -0
- package/dist/workflow-runtime/paths.d.ts +3 -0
- package/dist/workflow-runtime/paths.d.ts.map +1 -0
- package/dist/workflow-runtime/paths.js +11 -0
- package/dist/workflow-runtime/template.d.ts +7 -0
- package/dist/workflow-runtime/template.d.ts.map +1 -0
- package/dist/workflow-runtime/template.js +94 -0
- package/dist/workflow-runtime/types.d.ts +68 -0
- package/dist/workflow-runtime/types.d.ts.map +1 -0
- package/dist/workflow-runtime/types.js +1 -0
- package/dist/workflow-runtime/validate.d.ts +8 -0
- package/dist/workflow-runtime/validate.d.ts.map +1 -0
- package/dist/workflow-runtime/validate.js +331 -0
- package/package.json +3 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type TokenTotals = {
|
|
2
|
+
inputTokens: number;
|
|
3
|
+
outputTokens: number;
|
|
4
|
+
totalTokens: number;
|
|
5
|
+
};
|
|
6
|
+
export type TokenUsageEvent = {
|
|
7
|
+
threadId: string;
|
|
8
|
+
payload: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type TokenAccumulator = {
|
|
11
|
+
byThread: Record<string, TokenTotals>;
|
|
12
|
+
global: TokenTotals;
|
|
13
|
+
};
|
|
14
|
+
export declare function createTokenAccumulator(): TokenAccumulator;
|
|
15
|
+
export declare function applyTokenUsageEvent(state: TokenAccumulator, event: TokenUsageEvent): {
|
|
16
|
+
state: TokenAccumulator;
|
|
17
|
+
accepted: boolean;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=token-accounting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-accounting.d.ts","sourceRoot":"","sources":["../../src/harness/token-accounting.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAwDF,wBAAgB,sBAAsB,IAAI,gBAAgB,CAKzD;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,eAAe,GACrB;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAuBhD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const ZERO_TOTALS = {
|
|
2
|
+
inputTokens: 0,
|
|
3
|
+
outputTokens: 0,
|
|
4
|
+
totalTokens: 0,
|
|
5
|
+
};
|
|
6
|
+
function safeInt(value) {
|
|
7
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
8
|
+
return Math.trunc(value);
|
|
9
|
+
if (typeof value === "string" && /^\d+$/.test(value))
|
|
10
|
+
return Number.parseInt(value, 10);
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
function extractAbsoluteTotals(payload) {
|
|
14
|
+
const tokenUsage = payload.tokenUsage;
|
|
15
|
+
if (tokenUsage && typeof tokenUsage === "object" && !Array.isArray(tokenUsage)) {
|
|
16
|
+
const total = tokenUsage.total;
|
|
17
|
+
if (total && typeof total === "object" && !Array.isArray(total)) {
|
|
18
|
+
const totalObj = total;
|
|
19
|
+
const input = safeInt(totalObj.inputTokens);
|
|
20
|
+
const output = safeInt(totalObj.outputTokens);
|
|
21
|
+
const all = safeInt(totalObj.totalTokens);
|
|
22
|
+
if (input !== null && output !== null && all !== null) {
|
|
23
|
+
return { inputTokens: input, outputTokens: output, totalTokens: all };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const info = payload.info;
|
|
28
|
+
if (info && typeof info === "object" && !Array.isArray(info)) {
|
|
29
|
+
const totalUsage = info.total_token_usage;
|
|
30
|
+
if (totalUsage && typeof totalUsage === "object" && !Array.isArray(totalUsage)) {
|
|
31
|
+
const usage = totalUsage;
|
|
32
|
+
const input = safeInt(usage.input_tokens);
|
|
33
|
+
const output = safeInt(usage.output_tokens);
|
|
34
|
+
const all = safeInt(usage.total_tokens);
|
|
35
|
+
if (input !== null && output !== null && all !== null) {
|
|
36
|
+
return { inputTokens: input, outputTokens: output, totalTokens: all };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function mergeGlobal(byThread) {
|
|
43
|
+
const global = { ...ZERO_TOTALS };
|
|
44
|
+
for (const totals of Object.values(byThread)) {
|
|
45
|
+
global.inputTokens += totals.inputTokens;
|
|
46
|
+
global.outputTokens += totals.outputTokens;
|
|
47
|
+
global.totalTokens += totals.totalTokens;
|
|
48
|
+
}
|
|
49
|
+
return global;
|
|
50
|
+
}
|
|
51
|
+
export function createTokenAccumulator() {
|
|
52
|
+
return {
|
|
53
|
+
byThread: {},
|
|
54
|
+
global: { ...ZERO_TOTALS },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function applyTokenUsageEvent(state, event) {
|
|
58
|
+
const absolute = extractAbsoluteTotals(event.payload);
|
|
59
|
+
if (!absolute) {
|
|
60
|
+
return { state, accepted: false };
|
|
61
|
+
}
|
|
62
|
+
const prev = state.byThread[event.threadId] ?? { ...ZERO_TOTALS };
|
|
63
|
+
if (absolute.totalTokens < prev.totalTokens) {
|
|
64
|
+
return { state, accepted: false };
|
|
65
|
+
}
|
|
66
|
+
const nextByThread = {
|
|
67
|
+
...state.byThread,
|
|
68
|
+
[event.threadId]: absolute,
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
accepted: true,
|
|
72
|
+
state: {
|
|
73
|
+
byThread: nextByThread,
|
|
74
|
+
global: mergeGlobal(nextByThread),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function sanitizeWorkspaceKey(raw: string): string;
|
|
2
|
+
export declare function resolveWorkspacePath(root: string, key: string): string;
|
|
3
|
+
export declare function validateWorkspacePathInvariants(opts: {
|
|
4
|
+
root: string;
|
|
5
|
+
workspacePath: string;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
ok: true;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
code: "WORKSPACE_EQUALS_ROOT" | "WORKSPACE_OUTSIDE_ROOT" | "WORKSPACE_SYMLINK_ESCAPE" | "WORKSPACE_PATH_UNREADABLE";
|
|
11
|
+
path: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=workspace-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-safety.d.ts","sourceRoot":"","sources":["../../src/harness/workspace-safety.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CACP;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EACA,uBAAuB,GACvB,wBAAwB,GACxB,0BAA0B,GAC1B,2BAA2B,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CACJ,CAqDA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function sanitizeWorkspaceKey(raw) {
|
|
4
|
+
const normalized = raw.trim();
|
|
5
|
+
if (normalized.length === 0)
|
|
6
|
+
return "issue";
|
|
7
|
+
return normalized.replaceAll(/[^a-zA-Z0-9._-]/g, "_");
|
|
8
|
+
}
|
|
9
|
+
export function resolveWorkspacePath(root, key) {
|
|
10
|
+
return path.join(path.resolve(root), sanitizeWorkspaceKey(key));
|
|
11
|
+
}
|
|
12
|
+
export async function validateWorkspacePathInvariants(opts) {
|
|
13
|
+
const root = path.resolve(opts.root);
|
|
14
|
+
const workspace = path.resolve(opts.workspacePath);
|
|
15
|
+
const rootPrefix = `${root}${path.sep}`;
|
|
16
|
+
if (workspace === root) {
|
|
17
|
+
return {
|
|
18
|
+
ok: false,
|
|
19
|
+
code: "WORKSPACE_EQUALS_ROOT",
|
|
20
|
+
path: workspace,
|
|
21
|
+
message: "Workspace path must not equal workspace root.",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!(workspace === root || workspace.startsWith(rootPrefix))) {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
code: "WORKSPACE_OUTSIDE_ROOT",
|
|
28
|
+
path: workspace,
|
|
29
|
+
message: "Workspace path escapes configured workspace root.",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const relative = path.relative(root, workspace);
|
|
33
|
+
const segments = relative.split(path.sep).filter((s) => s.length > 0);
|
|
34
|
+
let cursor = root;
|
|
35
|
+
for (const segment of segments) {
|
|
36
|
+
cursor = path.join(cursor, segment);
|
|
37
|
+
try {
|
|
38
|
+
const stat = await fs.lstat(cursor);
|
|
39
|
+
if (stat.isSymbolicLink()) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
code: "WORKSPACE_SYMLINK_ESCAPE",
|
|
43
|
+
path: cursor,
|
|
44
|
+
message: "Workspace path contains a symlink component.",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const err = error;
|
|
50
|
+
if (err.code === "ENOENT") {
|
|
51
|
+
return { ok: true };
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
code: "WORKSPACE_PATH_UNREADABLE",
|
|
56
|
+
path: cursor,
|
|
57
|
+
message: `Workspace path cannot be validated: ${err.message}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { ok: true };
|
|
62
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../../src/policy/rules/allowlist.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"allowlist.d.ts","sourceRoot":"","sources":["../../../src/policy/rules/allowlist.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,YAAY,CA0C9D"}
|
|
@@ -17,6 +17,15 @@ export function allowlistRule(ctx) {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
const allow = allowRaw.map((p) => normalizeGitPathPrefix(p));
|
|
20
|
+
if (allow.includes(".")) {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
errors: [
|
|
24
|
+
gitError("Repo-wide allowlist ('.') is not allowed; choose minimal prefixes (tip: `agentplane guard suggest-allow --format args`)."),
|
|
25
|
+
],
|
|
26
|
+
warnings: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
20
29
|
const errors = [];
|
|
21
30
|
for (const filePath of staged) {
|
|
22
31
|
if (!allow.some((prefix) => gitPathIsUnderPrefix(filePath, prefix))) {
|
|
@@ -4,10 +4,14 @@ export type BundledRecipesCatalog = {
|
|
|
4
4
|
id: string;
|
|
5
5
|
summary: string;
|
|
6
6
|
description?: string;
|
|
7
|
+
source_path?: string;
|
|
7
8
|
versions: {
|
|
8
9
|
version: string;
|
|
9
10
|
}[];
|
|
10
11
|
}[];
|
|
11
12
|
};
|
|
13
|
+
export type BundledRecipeEntry = BundledRecipesCatalog["recipes"][number];
|
|
12
14
|
export declare const BUNDLED_RECIPES_CATALOG: BundledRecipesCatalog;
|
|
15
|
+
export declare function resolveBundledRecipeSourcePath(recipeId: string): string | null;
|
|
16
|
+
export declare function getBundledRecipeEntry(recipeId: string): BundledRecipeEntry | null;
|
|
13
17
|
//# sourceMappingURL=bundled-recipes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundled-recipes.d.ts","sourceRoot":"","sources":["../../src/recipes/bundled-recipes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bundled-recipes.d.ts","sourceRoot":"","sources":["../../src/recipes/bundled-recipes.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACjC,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,eAAO,MAAM,uBAAuB,EAAE,qBAGrC,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9E;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAEjF"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
1
2
|
export const BUNDLED_RECIPES_CATALOG = {
|
|
2
3
|
schema_version: 1,
|
|
3
4
|
recipes: [],
|
|
4
5
|
};
|
|
6
|
+
export function resolveBundledRecipeSourcePath(recipeId) {
|
|
7
|
+
const entry = getBundledRecipeEntry(recipeId);
|
|
8
|
+
const sourcePath = entry?.source_path?.trim();
|
|
9
|
+
if (!sourcePath)
|
|
10
|
+
return null;
|
|
11
|
+
return fileURLToPath(new URL(`../../assets/${sourcePath.replace(/^\/+/, "")}`, import.meta.url));
|
|
12
|
+
}
|
|
13
|
+
export function getBundledRecipeEntry(recipeId) {
|
|
14
|
+
return BUNDLED_RECIPES_CATALOG.recipes.find((recipe) => recipe.id === recipeId) ?? null;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allow-prefix-policy.d.ts","sourceRoot":"","sources":["../../src/shared/allow-prefix-policy.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEtE;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKnE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { normalizeGitPathPrefix } from "./git-path.js";
|
|
2
|
+
export function findRepoWideAllowPrefixes(prefixes) {
|
|
3
|
+
return prefixes.filter((prefix) => normalizeGitPathPrefix(prefix) === ".");
|
|
4
|
+
}
|
|
5
|
+
export function repoWideAllowPrefixMessage(flagName) {
|
|
6
|
+
return (`${flagName} cannot be repo-wide ('.'). ` +
|
|
7
|
+
"Choose minimal path prefixes; tip: `agentplane guard suggest-allow --format args`.");
|
|
8
|
+
}
|
package/dist/shared/errors.d.ts
CHANGED
|
@@ -17,6 +17,12 @@ export type JsonErrorGuidance = {
|
|
|
17
17
|
reason: string;
|
|
18
18
|
reasonCode?: string;
|
|
19
19
|
};
|
|
20
|
+
reasonDecode?: {
|
|
21
|
+
code: string;
|
|
22
|
+
category: string;
|
|
23
|
+
summary: string;
|
|
24
|
+
action: string;
|
|
25
|
+
};
|
|
20
26
|
};
|
|
21
27
|
export declare function formatJsonError(err: CliError, guidance?: JsonErrorGuidance): string;
|
|
22
28
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,MAAM,GACN,OAAO,GACP,WAAW,GACX,WAAW,GACX,YAAY,CAAC;AAEjB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEtC,IAAI,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC;CAMF;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,MAAM,GACN,OAAO,GACP,WAAW,GACX,WAAW,GACX,YAAY,CAAC;AAEjB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAEtC,IAAI,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC;CAMF;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAenF"}
|
package/dist/shared/errors.js
CHANGED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WorkflowBuildInput, WorkflowBuildOutput } from "./types.js";
|
|
2
|
+
export declare function buildWorkflowFromTemplates(input: WorkflowBuildInput): WorkflowBuildOutput;
|
|
3
|
+
export declare const DEFAULT_WORKFLOW_TEMPLATE = "---\nversion: 1\nmode: direct\nowners:\n orchestrator: ORCHESTRATOR\napprovals:\n require_plan: true\n require_verify: true\n require_network: true\nretry_policy:\n normal_exit_continuation: true\n abnormal_backoff: exponential\n max_attempts: 5\ntimeouts:\n stall_seconds: 900\nin_scope_paths:\n - packages/**\n---\n\n## Prompt Template\nRepository root: {{ runtime.repo_root }}\nWorkflow mode: {{ workflow.mode }}\n\n## Checks\n- preflight\n- verify\n- finish\n\n## Fallback\nlast_known_good: .agentplane/workflows/last-known-good.md\n";
|
|
4
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/workflow-runtime/build.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAsB,MAAM,YAAY,CAAC;AAqC9F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CA8DzF;AAED,eAAO,MAAM,yBAAyB,uiBA8BrC,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { parseWorkflowMarkdown, serializeWorkflowMarkdown } from "./markdown.js";
|
|
2
|
+
import { emitWorkflowEvent } from "./observability.js";
|
|
3
|
+
import { renderTemplateStrict, validateTemplateStrict } from "./template.js";
|
|
4
|
+
import { validateWorkflowDocument } from "./validate.js";
|
|
5
|
+
function mergeRecord(baseValue, overrideValue) {
|
|
6
|
+
const out = { ...baseValue };
|
|
7
|
+
for (const [key, value] of Object.entries(overrideValue)) {
|
|
8
|
+
if (value &&
|
|
9
|
+
typeof value === "object" &&
|
|
10
|
+
!Array.isArray(value) &&
|
|
11
|
+
out[key] &&
|
|
12
|
+
typeof out[key] === "object" &&
|
|
13
|
+
!Array.isArray(out[key])) {
|
|
14
|
+
out[key] = mergeRecord(out[key], value);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
out[key] = value;
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
function mergeSections(baseSections, overrideSections) {
|
|
22
|
+
const out = { ...baseSections };
|
|
23
|
+
for (const [key, value] of Object.entries(overrideSections)) {
|
|
24
|
+
if (value.trim().length === 0)
|
|
25
|
+
continue;
|
|
26
|
+
out[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
export function buildWorkflowFromTemplates(input) {
|
|
31
|
+
emitWorkflowEvent({ event: "workflow_build_started" });
|
|
32
|
+
const diagnostics = [];
|
|
33
|
+
const base = parseWorkflowMarkdown(input.baseTemplate);
|
|
34
|
+
diagnostics.push(...base.diagnostics);
|
|
35
|
+
const override = input.projectOverrideTemplate
|
|
36
|
+
? parseWorkflowMarkdown(input.projectOverrideTemplate)
|
|
37
|
+
: null;
|
|
38
|
+
if (override)
|
|
39
|
+
diagnostics.push(...override.diagnostics);
|
|
40
|
+
const mergedFrontMatter = mergeRecord(base.document.frontMatterRaw, override?.document.frontMatterRaw ?? {});
|
|
41
|
+
const runtimeWorkflow = input.runtimeContext.workflow;
|
|
42
|
+
if (runtimeWorkflow && typeof runtimeWorkflow === "object" && !Array.isArray(runtimeWorkflow)) {
|
|
43
|
+
const runtimeMode = runtimeWorkflow.mode;
|
|
44
|
+
if (runtimeMode === "direct" || runtimeMode === "branch_pr") {
|
|
45
|
+
mergedFrontMatter.mode = runtimeMode;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const mergedSections = mergeSections(base.document.sections, override?.document.sections ?? {});
|
|
49
|
+
const promptTemplate = mergedSections["Prompt Template"] ?? "";
|
|
50
|
+
const strict = validateTemplateStrict(promptTemplate, input.runtimeContext, {
|
|
51
|
+
strictVariables: true,
|
|
52
|
+
strictFilters: true,
|
|
53
|
+
});
|
|
54
|
+
diagnostics.push(...strict.diagnostics);
|
|
55
|
+
const renderedPrompt = renderTemplateStrict(promptTemplate, input.runtimeContext, {
|
|
56
|
+
strictVariables: true,
|
|
57
|
+
strictFilters: true,
|
|
58
|
+
});
|
|
59
|
+
diagnostics.push(...renderedPrompt.diagnostics);
|
|
60
|
+
mergedSections["Prompt Template"] = renderedPrompt.text;
|
|
61
|
+
const renderedText = serializeWorkflowMarkdown(mergedFrontMatter, mergedSections);
|
|
62
|
+
const parsedRendered = parseWorkflowMarkdown(renderedText);
|
|
63
|
+
diagnostics.push(...parsedRendered.diagnostics);
|
|
64
|
+
const schema = validateWorkflowDocument(parsedRendered.document);
|
|
65
|
+
diagnostics.push(...schema.diagnostics);
|
|
66
|
+
const hasError = diagnostics.some((d) => d.severity === "ERROR");
|
|
67
|
+
if (hasError) {
|
|
68
|
+
emitWorkflowEvent({
|
|
69
|
+
event: "workflow_build_failed",
|
|
70
|
+
details: { diagnostics: diagnostics.length },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
emitWorkflowEvent({
|
|
75
|
+
event: "workflow_build_completed",
|
|
76
|
+
details: { diagnostics: diagnostics.length },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
text: renderedText,
|
|
81
|
+
diagnostics,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export const DEFAULT_WORKFLOW_TEMPLATE = `---
|
|
85
|
+
version: 1
|
|
86
|
+
mode: direct
|
|
87
|
+
owners:
|
|
88
|
+
orchestrator: ORCHESTRATOR
|
|
89
|
+
approvals:
|
|
90
|
+
require_plan: true
|
|
91
|
+
require_verify: true
|
|
92
|
+
require_network: true
|
|
93
|
+
retry_policy:
|
|
94
|
+
normal_exit_continuation: true
|
|
95
|
+
abnormal_backoff: exponential
|
|
96
|
+
max_attempts: 5
|
|
97
|
+
timeouts:
|
|
98
|
+
stall_seconds: 900
|
|
99
|
+
in_scope_paths:
|
|
100
|
+
- packages/**
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Prompt Template
|
|
104
|
+
Repository root: {{ runtime.repo_root }}
|
|
105
|
+
Workflow mode: {{ workflow.mode }}
|
|
106
|
+
|
|
107
|
+
## Checks
|
|
108
|
+
- preflight
|
|
109
|
+
- verify
|
|
110
|
+
- finish
|
|
111
|
+
|
|
112
|
+
## Fallback
|
|
113
|
+
last_known_good: .agentplane/workflows/last-known-good.md
|
|
114
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement.d.ts","sourceRoot":"","sources":["../../src/workflow-runtime/enforcement.ts"],"names":[],"mappings":"AAEA,wBAAgB,6BAA6B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAI3F;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const DISABLED_VALUES = new Set(["0", "false", "off", "disabled"]);
|
|
2
|
+
export function isWorkflowEnforcementDisabled(env = process.env) {
|
|
3
|
+
const raw = env.AGENTPLANE_WORKFLOW_ENFORCEMENT ?? env.AGENTPLANE_WORKFLOW_CONTRACT;
|
|
4
|
+
if (typeof raw !== "string")
|
|
5
|
+
return false;
|
|
6
|
+
return DISABLED_VALUES.has(raw.trim().toLowerCase());
|
|
7
|
+
}
|
|
8
|
+
export function workflowEnforcementEnvHint() {
|
|
9
|
+
return "AGENTPLANE_WORKFLOW_ENFORCEMENT";
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { WorkflowDiagnostic, WorkflowDocument, WorkflowValidationResult } from "./types.js";
|
|
2
|
+
export declare function readWorkflowDocument(repoRoot: string, absPath?: string): Promise<{
|
|
3
|
+
document: WorkflowDocument | null;
|
|
4
|
+
diagnostics: WorkflowDiagnostic[];
|
|
5
|
+
path: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function validateWorkflowAtPath(repoRoot: string, absPath?: string): Promise<WorkflowValidationResult>;
|
|
8
|
+
export declare function validateWorkflowText(repoRoot: string, workflowText: string): Promise<WorkflowValidationResult>;
|
|
9
|
+
export declare function publishWorkflowCandidate(repoRoot: string, candidateText: string): Promise<WorkflowValidationResult>;
|
|
10
|
+
export declare function restoreWorkflowFromLastKnownGood(repoRoot: string): Promise<WorkflowValidationResult>;
|
|
11
|
+
//# sourceMappingURL=file-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-ops.d.ts","sourceRoot":"","sources":["../../src/workflow-runtime/file-ops.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAiDjG,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BjG;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,CAAC,CAuBnC;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,CAAC,CAanC;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,wBAAwB,CAAC,CA0DnC;AAED,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,CAAC,CA6EnC"}
|