@neurcode-ai/governance-runtime 0.1.3 → 0.1.5
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/dist/admission-provenance.d.ts +111 -0
- package/dist/admission-provenance.d.ts.map +1 -0
- package/dist/admission-provenance.js +735 -0
- package/dist/admission-provenance.js.map +1 -0
- package/dist/agent-guard-posture.d.ts +40 -0
- package/dist/agent-guard-posture.d.ts.map +1 -0
- package/dist/agent-guard-posture.js +117 -0
- package/dist/agent-guard-posture.js.map +1 -0
- package/dist/agent-invocation-observability.d.ts +47 -0
- package/dist/agent-invocation-observability.d.ts.map +1 -0
- package/dist/agent-invocation-observability.js +229 -0
- package/dist/agent-invocation-observability.js.map +1 -0
- package/dist/agent-plan.d.ts +119 -0
- package/dist/agent-plan.d.ts.map +1 -0
- package/dist/agent-plan.js +590 -0
- package/dist/agent-plan.js.map +1 -0
- package/dist/agent-runtime-adapter.d.ts +69 -0
- package/dist/agent-runtime-adapter.d.ts.map +1 -0
- package/dist/agent-runtime-adapter.js +274 -0
- package/dist/agent-runtime-adapter.js.map +1 -0
- package/dist/ai-change-record.d.ts +185 -0
- package/dist/ai-change-record.d.ts.map +1 -0
- package/dist/ai-change-record.js +580 -0
- package/dist/ai-change-record.js.map +1 -0
- package/dist/architecture-graph.d.ts +153 -0
- package/dist/architecture-graph.d.ts.map +1 -0
- package/dist/architecture-graph.js +646 -0
- package/dist/architecture-graph.js.map +1 -0
- package/dist/architecture-obligations.d.ts +161 -0
- package/dist/architecture-obligations.d.ts.map +1 -0
- package/dist/architecture-obligations.js +553 -0
- package/dist/architecture-obligations.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -1
- package/dist/index.js.map +1 -1
- package/dist/profile.d.ts +159 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +611 -0
- package/dist/profile.js.map +1 -0
- package/dist/session.d.ts +428 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2206 -0
- package/dist/session.js.map +1 -0
- package/package.json +13 -2
- package/src/constraints.ts +0 -828
- package/src/index.test.ts +0 -502
- package/src/index.ts +0 -463
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AGENT_PLAN_SCHEMA_VERSION = void 0;
|
|
7
|
+
exports.extractExpectedTargetsFromText = extractExpectedTargetsFromText;
|
|
8
|
+
exports.parsePlanSteps = parsePlanSteps;
|
|
9
|
+
exports.planImpliesSupportWork = planImpliesSupportWork;
|
|
10
|
+
exports.isTestOrUtilityPath = isTestOrUtilityPath;
|
|
11
|
+
exports.evaluatePlanCoherence = evaluatePlanCoherence;
|
|
12
|
+
exports.extractAgentPlan = extractAgentPlan;
|
|
13
|
+
exports.sanitizeAgentPlan = sanitizeAgentPlan;
|
|
14
|
+
exports.sanitizePlanCoherence = sanitizePlanCoherence;
|
|
15
|
+
const micromatch_1 = __importDefault(require("micromatch"));
|
|
16
|
+
exports.AGENT_PLAN_SCHEMA_VERSION = 1;
|
|
17
|
+
function normalizeRepoPath(pathValue) {
|
|
18
|
+
return pathValue.replace(/\\/g, '/').replace(/^\.\//, '').trim();
|
|
19
|
+
}
|
|
20
|
+
function uniqueNonEmpty(values) {
|
|
21
|
+
const out = [];
|
|
22
|
+
const seen = new Set();
|
|
23
|
+
for (const raw of values) {
|
|
24
|
+
const value = (raw ?? '').trim();
|
|
25
|
+
if (!value || seen.has(value)) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
seen.add(value);
|
|
29
|
+
out.push(value);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
function stripSourceLikePlanText(text) {
|
|
34
|
+
const withoutFencedCode = text.replace(/```[\s\S]*?```/g, '\n');
|
|
35
|
+
return withoutFencedCode
|
|
36
|
+
.split(/\r?\n/)
|
|
37
|
+
.filter((line) => {
|
|
38
|
+
const trimmed = line.trim();
|
|
39
|
+
if (!trimmed) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (/^(?:diff --git |index [0-9a-f]{6,}|@@ |--- |\+\+\+ |Binary files )/.test(trimmed)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return !/^[+-](?!\s)/.test(trimmed);
|
|
46
|
+
})
|
|
47
|
+
.join('\n');
|
|
48
|
+
}
|
|
49
|
+
const GLOB_CHARS = /[*?{}\[\]!]/;
|
|
50
|
+
function looksLikeGlob(token) {
|
|
51
|
+
return GLOB_CHARS.test(token);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Heuristic file-path detector. Matches tokens that look like repo paths:
|
|
55
|
+
* either they contain a directory separator, or they end in a common source
|
|
56
|
+
* file extension. Deliberately conservative to avoid capturing prose.
|
|
57
|
+
*/
|
|
58
|
+
const PATH_LIKE = /^(?:[\w.@~-]+\/)*[\w.@~-]+\.[A-Za-z0-9]{1,8}$/;
|
|
59
|
+
const DIR_PATH_LIKE = /^(?:[\w.@~-]+\/)+[\w.@~*-]+$/;
|
|
60
|
+
function looksLikePath(token) {
|
|
61
|
+
if (!token || token.length > 200) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (looksLikeGlob(token)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return PATH_LIKE.test(token) || DIR_PATH_LIKE.test(token);
|
|
68
|
+
}
|
|
69
|
+
/** Pull `inline code` spans out of markdown/plain text. */
|
|
70
|
+
function extractInlineCodeSpans(text) {
|
|
71
|
+
const spans = [];
|
|
72
|
+
const re = /`([^`]+)`/g;
|
|
73
|
+
let match;
|
|
74
|
+
while ((match = re.exec(text)) !== null) {
|
|
75
|
+
spans.push(match[1].trim());
|
|
76
|
+
}
|
|
77
|
+
return spans;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract expected file paths and globs from free-form plan text. We only look
|
|
81
|
+
* at backtick code spans and whitespace-delimited tokens that pass strict
|
|
82
|
+
* path/glob shape checks — never arbitrary words.
|
|
83
|
+
*/
|
|
84
|
+
function extractExpectedTargetsFromText(text) {
|
|
85
|
+
const files = [];
|
|
86
|
+
const globs = [];
|
|
87
|
+
const considerToken = (rawToken) => {
|
|
88
|
+
const token = rawToken
|
|
89
|
+
.replace(/^[("'`<\[]+/, '')
|
|
90
|
+
.replace(/[)"'`>\].,;:]+$/, '')
|
|
91
|
+
.trim();
|
|
92
|
+
if (!token) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const normalized = normalizeRepoPath(token);
|
|
96
|
+
if (!normalized) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (looksLikeGlob(normalized)) {
|
|
100
|
+
// A glob still needs at least one path-ish segment to be meaningful.
|
|
101
|
+
if (/[\w/]/.test(normalized.replace(GLOB_CHARS, ''))) {
|
|
102
|
+
globs.push(normalized);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (looksLikePath(normalized)) {
|
|
107
|
+
files.push(normalized);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
// Prefer code spans (highest signal), then fall back to all tokens.
|
|
111
|
+
for (const span of extractInlineCodeSpans(text)) {
|
|
112
|
+
for (const piece of span.split(/\s+/)) {
|
|
113
|
+
considerToken(piece);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const token of text.split(/\s+/)) {
|
|
117
|
+
considerToken(token);
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
expectedFiles: uniqueNonEmpty(files),
|
|
121
|
+
expectedGlobs: uniqueNonEmpty(globs),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const STEP_LINE = /^\s*(?:\d+[.)]|[-*+]|\[[ xX]?\])\s+(.*\S)\s*$/;
|
|
125
|
+
const NUMBERED_STEP = /^\s*\d+[.)]\s+/;
|
|
126
|
+
const CHECKLIST_STEP = /^\s*(?:[-*+]|\[[ xX]?\])\s+/;
|
|
127
|
+
/** Parse ordered/checklist step lines out of a markdown-ish block. */
|
|
128
|
+
function parsePlanSteps(text) {
|
|
129
|
+
const steps = [];
|
|
130
|
+
for (const line of text.split(/\r?\n/)) {
|
|
131
|
+
const match = line.match(STEP_LINE);
|
|
132
|
+
if (match) {
|
|
133
|
+
const step = match[1]
|
|
134
|
+
.replace(/^\[[ xX]?\]\s*/, '')
|
|
135
|
+
.trim();
|
|
136
|
+
if (step) {
|
|
137
|
+
steps.push(step);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return steps;
|
|
142
|
+
}
|
|
143
|
+
function hasPlanStructure(text) {
|
|
144
|
+
let stepCount = 0;
|
|
145
|
+
for (const line of text.split(/\r?\n/)) {
|
|
146
|
+
if (NUMBERED_STEP.test(line) || CHECKLIST_STEP.test(line)) {
|
|
147
|
+
stepCount += 1;
|
|
148
|
+
if (stepCount >= 2) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
const SUPPORT_KEYWORDS = [
|
|
156
|
+
'test',
|
|
157
|
+
'tests',
|
|
158
|
+
'testing',
|
|
159
|
+
'spec',
|
|
160
|
+
'fixture',
|
|
161
|
+
'mock',
|
|
162
|
+
'util',
|
|
163
|
+
'utils',
|
|
164
|
+
'utility',
|
|
165
|
+
'helper',
|
|
166
|
+
'helpers',
|
|
167
|
+
'refactor',
|
|
168
|
+
'type',
|
|
169
|
+
'types',
|
|
170
|
+
'typing',
|
|
171
|
+
'docs',
|
|
172
|
+
'documentation',
|
|
173
|
+
'comment',
|
|
174
|
+
'config',
|
|
175
|
+
'lint',
|
|
176
|
+
'format',
|
|
177
|
+
];
|
|
178
|
+
const SUPPORT_KEYWORD_RE = new RegExp(`\\b(?:${SUPPORT_KEYWORDS.join('|')})\\b`, 'i');
|
|
179
|
+
/** Does the plan text imply legitimate supporting work (tests/utils/refactor)? */
|
|
180
|
+
function planImpliesSupportWork(plan) {
|
|
181
|
+
if (!plan) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const haystack = [plan.summary, ...plan.steps, ...plan.constraints].join('\n');
|
|
185
|
+
return SUPPORT_KEYWORD_RE.test(haystack);
|
|
186
|
+
}
|
|
187
|
+
const TEST_OR_UTILITY_GLOBS = [
|
|
188
|
+
'**/*.test.*',
|
|
189
|
+
'**/*.spec.*',
|
|
190
|
+
'**/__tests__/**',
|
|
191
|
+
'**/__mocks__/**',
|
|
192
|
+
'**/test/**',
|
|
193
|
+
'**/tests/**',
|
|
194
|
+
'**/*.d.ts',
|
|
195
|
+
'**/utils/**',
|
|
196
|
+
'**/util/**',
|
|
197
|
+
'**/helpers/**',
|
|
198
|
+
'**/helper/**',
|
|
199
|
+
'**/fixtures/**',
|
|
200
|
+
'**/__fixtures__/**',
|
|
201
|
+
];
|
|
202
|
+
/** Is this path a conventional test or utility/support file? */
|
|
203
|
+
function isTestOrUtilityPath(filePath) {
|
|
204
|
+
const normalized = normalizeRepoPath(filePath);
|
|
205
|
+
if (!normalized) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return micromatch_1.default.isMatch(normalized, TEST_OR_UTILITY_GLOBS, { dot: true });
|
|
209
|
+
}
|
|
210
|
+
function matchPathAgainstGlobs(filePath, globs) {
|
|
211
|
+
if (globs.length === 0) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const normalized = normalizeRepoPath(filePath);
|
|
215
|
+
return globs.filter((glob) => {
|
|
216
|
+
const normalizedGlob = normalizeRepoPath(glob);
|
|
217
|
+
if (!normalizedGlob) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
return micromatch_1.default.isMatch(normalized, normalizedGlob, { dot: true });
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
function clampScore(score) {
|
|
224
|
+
if (!Number.isFinite(score)) {
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
return Math.max(0, Math.min(100, Math.round(score)));
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Deterministically grade an edit against the agent's plan.
|
|
231
|
+
*
|
|
232
|
+
* Verdict precedence:
|
|
233
|
+
* 1. No agent plan captured -> unknown
|
|
234
|
+
* 2. Path matches expectedFiles/globs -> planned
|
|
235
|
+
* 3. Path is intent-support/test/util AND plan implies support work -> implied
|
|
236
|
+
* 4. Otherwise -> unplanned
|
|
237
|
+
*
|
|
238
|
+
* NOTE: this is advisory in V1. Boundary/approval blocks always override this
|
|
239
|
+
* verdict at the call sites; an `unplanned` verdict alone must not block.
|
|
240
|
+
*/
|
|
241
|
+
function evaluatePlanCoherence(input) {
|
|
242
|
+
const { agentPlan, filePath } = input;
|
|
243
|
+
const normalizedPath = normalizeRepoPath(filePath || '');
|
|
244
|
+
if (!agentPlan) {
|
|
245
|
+
return {
|
|
246
|
+
verdict: 'unknown',
|
|
247
|
+
score: 0,
|
|
248
|
+
matchedPlanItems: [],
|
|
249
|
+
reasons: ['No agent plan captured for this session; plan coherence is unknown.'],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (!normalizedPath) {
|
|
253
|
+
return {
|
|
254
|
+
verdict: 'unknown',
|
|
255
|
+
score: 0,
|
|
256
|
+
matchedPlanItems: [],
|
|
257
|
+
reasons: ['No file path provided; plan coherence is unknown.'],
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const reasons = [];
|
|
261
|
+
const matchedPlanItems = [];
|
|
262
|
+
// (2) Direct plan match: exact expected file or expected glob.
|
|
263
|
+
const expectedFiles = (agentPlan.expectedFiles || []).map(normalizeRepoPath);
|
|
264
|
+
if (expectedFiles.includes(normalizedPath)) {
|
|
265
|
+
matchedPlanItems.push(normalizedPath);
|
|
266
|
+
reasons.push(`Path matches a file the plan expected to touch (${normalizedPath}).`);
|
|
267
|
+
return {
|
|
268
|
+
verdict: 'planned',
|
|
269
|
+
score: 100,
|
|
270
|
+
matchedPlanItems: uniqueNonEmpty(matchedPlanItems),
|
|
271
|
+
reasons,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const matchedGlobs = matchPathAgainstGlobs(normalizedPath, agentPlan.expectedGlobs || []);
|
|
275
|
+
if (matchedGlobs.length > 0) {
|
|
276
|
+
matchedPlanItems.push(...matchedGlobs);
|
|
277
|
+
reasons.push(`Path matches an expected plan glob (${matchedGlobs.join(', ')}).`);
|
|
278
|
+
return {
|
|
279
|
+
verdict: 'planned',
|
|
280
|
+
score: 90,
|
|
281
|
+
matchedPlanItems: uniqueNonEmpty(matchedPlanItems),
|
|
282
|
+
reasons,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
// (3) Implied support work: intent-support path or test/utility file, AND the
|
|
286
|
+
// plan acknowledges support work somewhere.
|
|
287
|
+
const intentMatches = matchPathAgainstGlobs(normalizedPath, input.intentSupportGlobs || []);
|
|
288
|
+
const isSupportPath = intentMatches.length > 0 || isTestOrUtilityPath(normalizedPath);
|
|
289
|
+
const planSupports = typeof input.planImpliesSupportWork === 'boolean'
|
|
290
|
+
? input.planImpliesSupportWork
|
|
291
|
+
: planImpliesSupportWork(agentPlan);
|
|
292
|
+
if (isSupportPath && planSupports) {
|
|
293
|
+
if (intentMatches.length > 0) {
|
|
294
|
+
matchedPlanItems.push(...intentMatches);
|
|
295
|
+
reasons.push(`Path falls under intent-support scope (${intentMatches.join(', ')}).`);
|
|
296
|
+
}
|
|
297
|
+
if (isTestOrUtilityPath(normalizedPath)) {
|
|
298
|
+
reasons.push('Path is a test/utility file consistent with the plan’s supporting work.');
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
verdict: 'implied',
|
|
302
|
+
score: 65,
|
|
303
|
+
matchedPlanItems: uniqueNonEmpty(matchedPlanItems),
|
|
304
|
+
reasons,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// (4) Neither plan nor intent justify this edit.
|
|
308
|
+
if (isSupportPath && !planSupports) {
|
|
309
|
+
reasons.push('Path looks like support work, but the plan never mentioned supporting work.');
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
reasons.push('Path matches neither the plan’s expected targets nor intent-support scope.');
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
verdict: 'unplanned',
|
|
316
|
+
score: clampScore(isSupportPath ? 35 : 15),
|
|
317
|
+
matchedPlanItems: [],
|
|
318
|
+
reasons,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
// Plan extraction from Claude Code hook payloads
|
|
323
|
+
// ---------------------------------------------------------------------------
|
|
324
|
+
function asString(value) {
|
|
325
|
+
return typeof value === 'string' && value.trim() ? value : undefined;
|
|
326
|
+
}
|
|
327
|
+
function asRecord(value) {
|
|
328
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
329
|
+
? value
|
|
330
|
+
: undefined;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Locate plan-bearing text inside a Claude Code hook payload, ranked by signal.
|
|
334
|
+
* Returns undefined when the payload only carries a user prompt (or nothing).
|
|
335
|
+
*
|
|
336
|
+
* High-signal sources, in priority order:
|
|
337
|
+
* 1. PreToolUse / ExitPlanMode -> tool_input.plan (the agent's actual plan)
|
|
338
|
+
* 2. PreToolUse / TodoWrite -> tool_input.todos (the agent's task list)
|
|
339
|
+
* 3. An explicit `plan` field (string or { summary/steps })
|
|
340
|
+
* 4. An assistant message / transcript turn containing plan structure
|
|
341
|
+
*
|
|
342
|
+
* The `prompt` / `user_prompt` field is treated as *user intent* and is never,
|
|
343
|
+
* on its own, promoted to an agent plan.
|
|
344
|
+
*/
|
|
345
|
+
function findPlanText(payload) {
|
|
346
|
+
const toolName = asString(payload.tool_name) ||
|
|
347
|
+
asString(payload.toolName) ||
|
|
348
|
+
asString(asRecord(payload.tool)?.name);
|
|
349
|
+
const toolInput = asRecord(payload.tool_input) ||
|
|
350
|
+
asRecord(payload.toolInput) ||
|
|
351
|
+
asRecord(payload.input);
|
|
352
|
+
// (1) ExitPlanMode carries the agent's plan verbatim.
|
|
353
|
+
if (toolInput && /exitplanmode/i.test(toolName || '')) {
|
|
354
|
+
const plan = asString(toolInput.plan);
|
|
355
|
+
if (plan) {
|
|
356
|
+
return { text: plan, source: 'claude_prompt', structured: true };
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// (2) TodoWrite carries an ordered task list.
|
|
360
|
+
if (toolInput && /todowrite/i.test(toolName || '')) {
|
|
361
|
+
const todos = Array.isArray(toolInput.todos) ? toolInput.todos : undefined;
|
|
362
|
+
if (todos && todos.length > 0) {
|
|
363
|
+
const steps = todos
|
|
364
|
+
.map((todo) => asString(asRecord(todo)?.content) || asString(asRecord(todo)?.activeForm))
|
|
365
|
+
.filter((value) => Boolean(value));
|
|
366
|
+
if (steps.length > 0) {
|
|
367
|
+
return {
|
|
368
|
+
text: steps.join('\n'),
|
|
369
|
+
source: 'claude_prompt',
|
|
370
|
+
structured: true,
|
|
371
|
+
steps,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// (3) An explicit plan field (used by manual/MCP callers).
|
|
377
|
+
const planField = payload.plan;
|
|
378
|
+
if (typeof planField === 'string') {
|
|
379
|
+
const trimmed = planField.trim();
|
|
380
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
381
|
+
try {
|
|
382
|
+
const parsed = asRecord(JSON.parse(trimmed));
|
|
383
|
+
if (parsed) {
|
|
384
|
+
const summary = asString(parsed.summary) || '';
|
|
385
|
+
const steps = Array.isArray(parsed.steps)
|
|
386
|
+
? parsed.steps.map((step) => asString(step)).filter((value) => Boolean(value))
|
|
387
|
+
: [];
|
|
388
|
+
if (summary || steps.length > 0) {
|
|
389
|
+
return {
|
|
390
|
+
text: [summary, ...steps].join('\n'),
|
|
391
|
+
source: 'mcp',
|
|
392
|
+
structured: true,
|
|
393
|
+
steps: steps.length > 0 ? steps : undefined,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
// Fall through to plain-string plan handling.
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
const planString = asString(planField);
|
|
404
|
+
if (planString) {
|
|
405
|
+
return { text: planString, source: 'claude_prompt', structured: true };
|
|
406
|
+
}
|
|
407
|
+
const planRecord = asRecord(planField);
|
|
408
|
+
if (planRecord) {
|
|
409
|
+
const summary = asString(planRecord.summary) || '';
|
|
410
|
+
const steps = Array.isArray(planRecord.steps)
|
|
411
|
+
? planRecord.steps.map((s) => asString(s)).filter((v) => Boolean(v))
|
|
412
|
+
: [];
|
|
413
|
+
if (summary || steps.length > 0) {
|
|
414
|
+
return {
|
|
415
|
+
text: [summary, ...steps].join('\n'),
|
|
416
|
+
source: 'claude_prompt',
|
|
417
|
+
structured: true,
|
|
418
|
+
steps: steps.length > 0 ? steps : undefined,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// (4) Assistant message / transcript with plan structure.
|
|
423
|
+
const assistantCandidates = [
|
|
424
|
+
asString(payload.assistant_message),
|
|
425
|
+
asString(payload.assistantMessage),
|
|
426
|
+
asString(asRecord(payload.message)?.content),
|
|
427
|
+
asString(payload.message),
|
|
428
|
+
asString(payload.transcript),
|
|
429
|
+
].filter((v) => Boolean(v));
|
|
430
|
+
for (const candidate of assistantCandidates) {
|
|
431
|
+
if (hasPlanStructure(candidate)) {
|
|
432
|
+
return { text: candidate, source: 'claude_prompt', structured: false };
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return undefined;
|
|
436
|
+
}
|
|
437
|
+
function firstSentence(text, max = 200) {
|
|
438
|
+
const collapsed = text.replace(/\s+/g, ' ').trim();
|
|
439
|
+
if (!collapsed) {
|
|
440
|
+
return '';
|
|
441
|
+
}
|
|
442
|
+
const stop = collapsed.search(/[.!?](?:\s|$)/);
|
|
443
|
+
const sentence = stop >= 0 ? collapsed.slice(0, stop + 1) : collapsed;
|
|
444
|
+
return sentence.length > max ? `${sentence.slice(0, max - 1).trim()}…` : sentence;
|
|
445
|
+
}
|
|
446
|
+
function deriveConfidence(args) {
|
|
447
|
+
const hasTargets = args.expectedFiles.length + args.expectedGlobs.length > 0;
|
|
448
|
+
if (args.structured && (hasTargets || args.steps.length >= 2)) {
|
|
449
|
+
return 'high';
|
|
450
|
+
}
|
|
451
|
+
if (args.structured || (args.steps.length >= 2 && hasTargets)) {
|
|
452
|
+
return 'medium';
|
|
453
|
+
}
|
|
454
|
+
return 'low';
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Deterministically extract an {@link AgentPlan} from a Claude Code hook
|
|
458
|
+
* payload. Returns null when no plan is present — callers must treat a null
|
|
459
|
+
* result as "no plan", never as a failure.
|
|
460
|
+
*
|
|
461
|
+
* This function never throws: any malformed payload yields null.
|
|
462
|
+
*/
|
|
463
|
+
function extractAgentPlan(payload, options = {}) {
|
|
464
|
+
try {
|
|
465
|
+
const record = asRecord(payload);
|
|
466
|
+
if (!record) {
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
const found = findPlanText(record);
|
|
470
|
+
if (!found) {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
const safeText = stripSourceLikePlanText(found.text);
|
|
474
|
+
const steps = found.steps && found.steps.length > 0
|
|
475
|
+
? uniqueNonEmpty(found.steps.map(stripSourceLikePlanText))
|
|
476
|
+
: uniqueNonEmpty(parsePlanSteps(safeText));
|
|
477
|
+
// Conservative: an unstructured assistant message must actually contain
|
|
478
|
+
// multiple steps to qualify as a plan.
|
|
479
|
+
if (!found.structured && steps.length < 2) {
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
const { expectedFiles, expectedGlobs } = extractExpectedTargetsFromText(safeText);
|
|
483
|
+
const summary = firstSentence(safeText) ||
|
|
484
|
+
(steps.length > 0 ? steps[0] : '') ||
|
|
485
|
+
'Agent plan';
|
|
486
|
+
const constraints = extractLabeledLines(safeText, ['constraint', 'guardrail', 'must not', 'do not', 'never']);
|
|
487
|
+
const risks = extractLabeledLines(safeText, ['risk', 'caveat', 'warning', 'danger']);
|
|
488
|
+
const capturedAt = (options.now ?? new Date()).toISOString();
|
|
489
|
+
return {
|
|
490
|
+
schemaVersion: exports.AGENT_PLAN_SCHEMA_VERSION,
|
|
491
|
+
summary,
|
|
492
|
+
steps,
|
|
493
|
+
expectedFiles,
|
|
494
|
+
expectedGlobs,
|
|
495
|
+
constraints,
|
|
496
|
+
risks,
|
|
497
|
+
capturedAt,
|
|
498
|
+
source: options.source ?? found.source,
|
|
499
|
+
confidence: deriveConfidence({
|
|
500
|
+
structured: found.structured,
|
|
501
|
+
steps,
|
|
502
|
+
expectedFiles,
|
|
503
|
+
expectedGlobs,
|
|
504
|
+
}),
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
// Plan capture must never fail the hook.
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
function extractLabeledLines(text, labels) {
|
|
513
|
+
const out = [];
|
|
514
|
+
const labelRe = new RegExp(`\\b(?:${labels.join('|')})\\b`, 'i');
|
|
515
|
+
for (const line of text.split(/\r?\n/)) {
|
|
516
|
+
const trimmed = line.replace(STEP_LINE, '$1').trim();
|
|
517
|
+
if (trimmed && labelRe.test(trimmed)) {
|
|
518
|
+
out.push(trimmed);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return uniqueNonEmpty(out);
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Source-free projection of an agent plan for live sync / evidence export.
|
|
525
|
+
* Drops nothing sensitive (the model is already source-free) but enforces the
|
|
526
|
+
* shape and trims away anything unexpected callers may have attached.
|
|
527
|
+
*/
|
|
528
|
+
function sanitizeAgentPlan(value) {
|
|
529
|
+
const record = asRecord(value);
|
|
530
|
+
if (!record) {
|
|
531
|
+
return undefined;
|
|
532
|
+
}
|
|
533
|
+
const summary = asString(record.summary) || '';
|
|
534
|
+
const steps = Array.isArray(record.steps)
|
|
535
|
+
? uniqueNonEmpty(record.steps.map((s) => asString(s) || ''))
|
|
536
|
+
: [];
|
|
537
|
+
if (!summary && steps.length === 0) {
|
|
538
|
+
return undefined;
|
|
539
|
+
}
|
|
540
|
+
const source = ['claude_prompt', 'manual', 'mcp', 'unknown'].includes(record.source)
|
|
541
|
+
? record.source
|
|
542
|
+
: 'unknown';
|
|
543
|
+
const confidence = ['high', 'medium', 'low'].includes(record.confidence)
|
|
544
|
+
? record.confidence
|
|
545
|
+
: 'low';
|
|
546
|
+
const schemaVersion = typeof record.schemaVersion === 'number' ? record.schemaVersion : exports.AGENT_PLAN_SCHEMA_VERSION;
|
|
547
|
+
return {
|
|
548
|
+
schemaVersion,
|
|
549
|
+
summary,
|
|
550
|
+
steps,
|
|
551
|
+
expectedFiles: Array.isArray(record.expectedFiles)
|
|
552
|
+
? uniqueNonEmpty(record.expectedFiles.map((s) => asString(s) || ''))
|
|
553
|
+
: [],
|
|
554
|
+
expectedGlobs: Array.isArray(record.expectedGlobs)
|
|
555
|
+
? uniqueNonEmpty(record.expectedGlobs.map((s) => asString(s) || ''))
|
|
556
|
+
: [],
|
|
557
|
+
constraints: Array.isArray(record.constraints)
|
|
558
|
+
? uniqueNonEmpty(record.constraints.map((s) => asString(s) || ''))
|
|
559
|
+
: [],
|
|
560
|
+
risks: Array.isArray(record.risks)
|
|
561
|
+
? uniqueNonEmpty(record.risks.map((s) => asString(s) || ''))
|
|
562
|
+
: [],
|
|
563
|
+
capturedAt: asString(record.capturedAt) || new Date().toISOString(),
|
|
564
|
+
source,
|
|
565
|
+
confidence,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
/** Sanitize a plan-coherence result coming back over the wire. */
|
|
569
|
+
function sanitizePlanCoherence(value) {
|
|
570
|
+
const record = asRecord(value);
|
|
571
|
+
if (!record) {
|
|
572
|
+
return undefined;
|
|
573
|
+
}
|
|
574
|
+
const verdicts = ['planned', 'implied', 'unplanned', 'unknown'];
|
|
575
|
+
const verdict = verdicts.includes(record.verdict)
|
|
576
|
+
? record.verdict
|
|
577
|
+
: 'unknown';
|
|
578
|
+
const score = typeof record.score === 'number' ? clampScore(record.score) : 0;
|
|
579
|
+
return {
|
|
580
|
+
verdict,
|
|
581
|
+
score,
|
|
582
|
+
matchedPlanItems: Array.isArray(record.matchedPlanItems)
|
|
583
|
+
? uniqueNonEmpty(record.matchedPlanItems.map((s) => asString(s) || ''))
|
|
584
|
+
: [],
|
|
585
|
+
reasons: Array.isArray(record.reasons)
|
|
586
|
+
? uniqueNonEmpty(record.reasons.map((s) => asString(s) || ''))
|
|
587
|
+
: [],
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=agent-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-plan.js","sourceRoot":"","sources":["../src/agent-plan.ts"],"names":[],"mappings":"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"}
|