openplanr 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/backlog.d.ts.map +1 -1
- package/dist/cli/commands/backlog.js +3 -0
- package/dist/cli/commands/backlog.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +3 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +2 -0
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/feature.d.ts.map +1 -1
- package/dist/cli/commands/feature.js +2 -0
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/operate.d.ts +5 -2
- package/dist/cli/commands/operate.d.ts.map +1 -1
- package/dist/cli/commands/operate.js +10 -101
- package/dist/cli/commands/operate.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +2 -0
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/quick.d.ts.map +1 -1
- package/dist/cli/commands/quick.js +2 -0
- package/dist/cli/commands/quick.js.map +1 -1
- package/dist/cli/commands/refine.d.ts.map +1 -1
- package/dist/cli/commands/refine.js +2 -0
- package/dist/cli/commands/refine.js.map +1 -1
- package/dist/cli/commands/revise.d.ts.map +1 -1
- package/dist/cli/commands/revise.js +2 -0
- package/dist/cli/commands/revise.js.map +1 -1
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +2 -0
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +2 -0
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/story.d.ts.map +1 -1
- package/dist/cli/commands/story.js +3 -0
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +3 -0
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/services/ai-service.d.ts +3 -5
- package/dist/services/ai-service.d.ts.map +1 -1
- package/dist/services/ai-service.js +7 -1
- package/dist/services/ai-service.js.map +1 -1
- package/dist/services/credentials-service.d.ts.map +1 -1
- package/dist/services/credentials-service.js +2 -0
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/deprecation-notices.d.ts +5 -0
- package/dist/services/deprecation-notices.d.ts.map +1 -0
- package/dist/services/deprecation-notices.js +6 -0
- package/dist/services/deprecation-notices.js.map +1 -0
- package/dist/services/operate/advisors.d.ts +146 -108
- package/dist/services/operate/advisors.d.ts.map +1 -1
- package/dist/services/operate/advisors.js +178 -448
- package/dist/services/operate/advisors.js.map +1 -1
- package/dist/services/operate/citation-resolution.d.ts.map +1 -1
- package/dist/services/operate/citation-resolution.js +50 -1
- package/dist/services/operate/citation-resolution.js.map +1 -1
- package/dist/services/operate/config.d.ts +28 -52
- package/dist/services/operate/config.d.ts.map +1 -1
- package/dist/services/operate/config.js +68 -203
- package/dist/services/operate/config.js.map +1 -1
- package/dist/services/operate/doctor.d.ts +15 -0
- package/dist/services/operate/doctor.d.ts.map +1 -1
- package/dist/services/operate/doctor.js +142 -32
- package/dist/services/operate/doctor.js.map +1 -1
- package/dist/services/operate/engine.d.ts +22 -62
- package/dist/services/operate/engine.d.ts.map +1 -1
- package/dist/services/operate/engine.js +269 -191
- package/dist/services/operate/engine.js.map +1 -1
- package/dist/services/operate/evidence.d.ts +9 -78
- package/dist/services/operate/evidence.d.ts.map +1 -1
- package/dist/services/operate/evidence.js +0 -1194
- package/dist/services/operate/evidence.js.map +1 -1
- package/dist/services/operate/index.d.ts.map +1 -1
- package/dist/services/operate/index.js +15 -231
- package/dist/services/operate/index.js.map +1 -1
- package/dist/services/operate/integrity.d.ts +81 -0
- package/dist/services/operate/integrity.d.ts.map +1 -0
- package/dist/services/operate/integrity.js +152 -0
- package/dist/services/operate/integrity.js.map +1 -0
- package/dist/services/operate/interaction/answer-service.d.ts +0 -10
- package/dist/services/operate/interaction/answer-service.d.ts.map +1 -1
- package/dist/services/operate/interaction/answer-service.js +63 -43
- package/dist/services/operate/interaction/answer-service.js.map +1 -1
- package/dist/services/operate/interaction/question-engine.d.ts.map +1 -1
- package/dist/services/operate/interaction/question-engine.js +105 -21
- package/dist/services/operate/interaction/question-engine.js.map +1 -1
- package/dist/services/operate/interaction/question-registry.d.ts +16 -1
- package/dist/services/operate/interaction/question-registry.d.ts.map +1 -1
- package/dist/services/operate/interaction/question-registry.js +45 -39
- package/dist/services/operate/interaction/question-registry.js.map +1 -1
- package/dist/services/operate/interaction/session-service.d.ts.map +1 -1
- package/dist/services/operate/interaction/session-service.js +16 -11
- package/dist/services/operate/interaction/session-service.js.map +1 -1
- package/dist/services/operate/interaction/terminal-renderer.d.ts.map +1 -1
- package/dist/services/operate/interaction/terminal-renderer.js +16 -6
- package/dist/services/operate/interaction/terminal-renderer.js.map +1 -1
- package/dist/services/operate/lifecycle.d.ts.map +1 -1
- package/dist/services/operate/lifecycle.js +17 -1
- package/dist/services/operate/lifecycle.js.map +1 -1
- package/dist/services/operate/maintenance.d.ts.map +1 -1
- package/dist/services/operate/maintenance.js +95 -276
- package/dist/services/operate/maintenance.js.map +1 -1
- package/dist/services/operate/mission-dispatch.d.ts +73 -55
- package/dist/services/operate/mission-dispatch.d.ts.map +1 -1
- package/dist/services/operate/mission-dispatch.js +91 -67
- package/dist/services/operate/mission-dispatch.js.map +1 -1
- package/dist/services/operate/projection-persistence.d.ts +35 -7
- package/dist/services/operate/projection-persistence.d.ts.map +1 -1
- package/dist/services/operate/projection-persistence.js +142 -53
- package/dist/services/operate/projection-persistence.js.map +1 -1
- package/dist/services/operate/projection.d.ts +9 -1
- package/dist/services/operate/projection.d.ts.map +1 -1
- package/dist/services/operate/projection.js +22 -12
- package/dist/services/operate/projection.js.map +1 -1
- package/dist/services/operate/protocol.d.ts +1 -41
- package/dist/services/operate/protocol.d.ts.map +1 -1
- package/dist/services/operate/protocol.js +7 -45
- package/dist/services/operate/protocol.js.map +1 -1
- package/dist/services/operate/redaction.d.ts +3 -3
- package/dist/services/operate/redaction.js +4 -4
- package/dist/services/operate/redaction.js.map +1 -1
- package/dist/services/operate/reports.d.ts +20 -1
- package/dist/services/operate/reports.d.ts.map +1 -1
- package/dist/services/operate/reports.js +108 -4
- package/dist/services/operate/reports.js.map +1 -1
- package/dist/services/operate/routes.d.ts +84 -0
- package/dist/services/operate/routes.d.ts.map +1 -1
- package/dist/services/operate/routes.js +519 -10
- package/dist/services/operate/routes.js.map +1 -1
- package/dist/services/operate/types.d.ts +48 -133
- package/dist/services/operate/types.d.ts.map +1 -1
- package/dist/services/operate/types.js.map +1 -1
- package/dist/services/operate/workspace.d.ts +0 -1
- package/dist/services/operate/workspace.d.ts.map +1 -1
- package/dist/services/operate/workspace.js +0 -2
- package/dist/services/operate/workspace.js.map +1 -1
- package/dist/services/runtime-manager-service.js +2 -2
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/package.json +3 -3
- package/dist/services/operate/evidence-classifications.d.ts +0 -59
- package/dist/services/operate/evidence-classifications.d.ts.map +0 -1
- package/dist/services/operate/evidence-classifications.js +0 -132
- package/dist/services/operate/evidence-classifications.js.map +0 -1
- package/dist/services/operate/evidence-diagnostics.d.ts +0 -23
- package/dist/services/operate/evidence-diagnostics.d.ts.map +0 -1
- package/dist/services/operate/evidence-diagnostics.js +0 -152
- package/dist/services/operate/evidence-diagnostics.js.map +0 -1
- package/dist/services/operate/evidence-readiness.d.ts +0 -8
- package/dist/services/operate/evidence-readiness.d.ts.map +0 -1
- package/dist/services/operate/evidence-readiness.js +0 -84
- package/dist/services/operate/evidence-readiness.js.map +0 -1
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
export declare function classifyEvidenceDiagnostic(input: {
|
|
2
|
-
projectRoot: string;
|
|
3
|
-
candidateId: string;
|
|
4
|
-
status: 'false-positive' | 'confirmed-secret';
|
|
5
|
-
reason: string;
|
|
6
|
-
classifiedBy: string;
|
|
7
|
-
confirmationDigest?: string;
|
|
8
|
-
confirmed: boolean;
|
|
9
|
-
localRoot?: string;
|
|
10
|
-
now?: Date;
|
|
11
|
-
}): Promise<{
|
|
12
|
-
state: string;
|
|
13
|
-
candidateId: string;
|
|
14
|
-
action: import("./types.js").StructuredOperatingAction;
|
|
15
|
-
confirmation: import("./types.js").GuidedConfirmation | null;
|
|
16
|
-
valueDisclosed: boolean;
|
|
17
|
-
diagnostic?: undefined;
|
|
18
|
-
} | {
|
|
19
|
-
state: string;
|
|
20
|
-
diagnostic: {
|
|
21
|
-
classification: {
|
|
22
|
-
status: "false-positive" | "confirmed-secret";
|
|
23
|
-
ruleId: string;
|
|
24
|
-
contentDigest: `sha256:${string}`;
|
|
25
|
-
projectHead: `sha256:${string}`;
|
|
26
|
-
reason: string;
|
|
27
|
-
confirmationDigest: `sha256:${string}`;
|
|
28
|
-
classifiedAt: string;
|
|
29
|
-
classifiedBy: string;
|
|
30
|
-
};
|
|
31
|
-
kind: "evidence-diagnostic";
|
|
32
|
-
schemaVersion: "1.0.0";
|
|
33
|
-
protocolVersion: "1.2.0";
|
|
34
|
-
candidateId: string;
|
|
35
|
-
source: "repository" | "planr" | "git" | "import-json" | "import-csv" | "github" | "linear";
|
|
36
|
-
componentId: string;
|
|
37
|
-
location?: string;
|
|
38
|
-
line?: number;
|
|
39
|
-
ruleId: string;
|
|
40
|
-
category: "assignment" | "known-token" | "authorization" | "private-key" | "jwt" | "credential-url" | "structured-secret";
|
|
41
|
-
contentDigest: `sha256:${string}`;
|
|
42
|
-
projectHead: `sha256:${string}`;
|
|
43
|
-
valueDisclosed: false;
|
|
44
|
-
actions: import("./types.js").StructuredOperatingAction[];
|
|
45
|
-
};
|
|
46
|
-
candidateId?: undefined;
|
|
47
|
-
action?: undefined;
|
|
48
|
-
confirmation?: undefined;
|
|
49
|
-
valueDisclosed?: undefined;
|
|
50
|
-
}>;
|
|
51
|
-
export declare function purgeStaleEvidenceClassifications(input: {
|
|
52
|
-
projectRoot: string;
|
|
53
|
-
localRoot?: string;
|
|
54
|
-
purge?: boolean;
|
|
55
|
-
}): Promise<{
|
|
56
|
-
stale: number;
|
|
57
|
-
purged: number;
|
|
58
|
-
}>;
|
|
59
|
-
//# sourceMappingURL=evidence-classifications.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-classifications.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence-classifications.ts"],"names":[],"mappings":"AAuBA,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkHA;AAED,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB7C"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { appendFile, mkdir } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { canonicalDigest, canonicalize } from './canonical.js';
|
|
4
|
-
import { listEvidenceDiagnostics, readEvidenceDiagnostic, writeEvidenceDiagnostic, } from './evidence-diagnostics.js';
|
|
5
|
-
import { createOperatingAction } from './interaction/action-service.js';
|
|
6
|
-
import { assertOperatingConfirmation } from './interaction/confirmation-service.js';
|
|
7
|
-
import { currentGuidedSessionBindings } from './interaction/session-service.js';
|
|
8
|
-
import { redactSensitiveText } from './redaction.js';
|
|
9
|
-
import { OperateError } from './types.js';
|
|
10
|
-
import { resolveOperatingPaths } from './workspace.js';
|
|
11
|
-
const HARD_BLOCK_CATEGORIES = new Set([
|
|
12
|
-
'known-token',
|
|
13
|
-
'private-key',
|
|
14
|
-
'jwt',
|
|
15
|
-
'authorization',
|
|
16
|
-
'credential-url',
|
|
17
|
-
]);
|
|
18
|
-
export async function classifyEvidenceDiagnostic(input) {
|
|
19
|
-
const diagnostic = await readEvidenceDiagnostic(input);
|
|
20
|
-
const bindings = await currentGuidedSessionBindings(input.projectRoot);
|
|
21
|
-
if (bindings.projectHead !== diagnostic.projectHead) {
|
|
22
|
-
throw new OperateError('E_OPERATE_ROUTE_DRIFT', 'The project head changed after evidence diagnosis.', { changedDimensions: ['projectHead'], candidateId: diagnostic.candidateId });
|
|
23
|
-
}
|
|
24
|
-
if (input.status === 'false-positive' && HARD_BLOCK_CATEGORIES.has(diagnostic.category)) {
|
|
25
|
-
throw new OperateError('E_OPERATE_SECRET_DETECTED', 'Known credential, authorization, private-key, JWT, and credential-URL signatures cannot be classified as false positives.', {
|
|
26
|
-
candidateId: diagnostic.candidateId,
|
|
27
|
-
ruleId: diagnostic.ruleId,
|
|
28
|
-
category: diagnostic.category,
|
|
29
|
-
valueDisclosed: false,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
const reason = input.reason.replace(/\s+/g, ' ').trim();
|
|
33
|
-
if (!reason || reason.length > 1_000) {
|
|
34
|
-
throw new OperateError('E_OPERATE_CONFIG_INVALID', 'Evidence classification requires a bounded reason.');
|
|
35
|
-
}
|
|
36
|
-
const sanitizedReason = redactSensitiveText(reason);
|
|
37
|
-
if (sanitizedReason.redactions.length > 0) {
|
|
38
|
-
throw new OperateError('E_OPERATE_CONFIG_INVALID', 'Evidence classification reasons cannot contain sensitive material.');
|
|
39
|
-
}
|
|
40
|
-
const created = await createOperatingAction({
|
|
41
|
-
id: 'operate.evidence.classify',
|
|
42
|
-
label: input.status === 'false-positive'
|
|
43
|
-
? 'Classify this exact candidate as a false positive'
|
|
44
|
-
: 'Confirm that this candidate requires source remediation',
|
|
45
|
-
command: `planr operate evidence classify ${diagnostic.candidateId}`,
|
|
46
|
-
effect: 'machine-local-write',
|
|
47
|
-
confirmation: {
|
|
48
|
-
sessionId: `GIS-evidence-${diagnostic.candidateId.slice('EVC-'.length)}`,
|
|
49
|
-
confirmationScope: `operate.evidence.classify:${diagnostic.candidateId}:${input.status}`,
|
|
50
|
-
projectIdentity: bindings.projectIdentity,
|
|
51
|
-
projectHead: bindings.projectHead,
|
|
52
|
-
configHead: bindings.configHead,
|
|
53
|
-
eventHead: null,
|
|
54
|
-
arguments: [
|
|
55
|
-
input.status,
|
|
56
|
-
canonicalDigest(reason),
|
|
57
|
-
diagnostic.ruleId,
|
|
58
|
-
diagnostic.contentDigest,
|
|
59
|
-
],
|
|
60
|
-
destinations: [],
|
|
61
|
-
writes: [`evidence-diagnostics/${diagnostic.candidateId}.json`],
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
if (!input.confirmed || !input.confirmationDigest || !created.confirmation) {
|
|
65
|
-
return {
|
|
66
|
-
state: 'preview',
|
|
67
|
-
candidateId: diagnostic.candidateId,
|
|
68
|
-
action: created.action,
|
|
69
|
-
confirmation: created.confirmation,
|
|
70
|
-
valueDisclosed: false,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
const accepted = assertOperatingConfirmation({
|
|
74
|
-
expected: created.confirmation,
|
|
75
|
-
actionId: created.action.id,
|
|
76
|
-
confirmationDigest: input.confirmationDigest,
|
|
77
|
-
confirmed: input.confirmed,
|
|
78
|
-
now: input.now,
|
|
79
|
-
});
|
|
80
|
-
const classifiedAt = (input.now ?? new Date()).toISOString();
|
|
81
|
-
const next = {
|
|
82
|
-
...diagnostic,
|
|
83
|
-
classification: {
|
|
84
|
-
status: input.status,
|
|
85
|
-
ruleId: diagnostic.ruleId,
|
|
86
|
-
contentDigest: diagnostic.contentDigest,
|
|
87
|
-
projectHead: diagnostic.projectHead,
|
|
88
|
-
reason,
|
|
89
|
-
confirmationDigest: accepted.confirmationDigest,
|
|
90
|
-
classifiedAt,
|
|
91
|
-
classifiedBy: input.classifiedBy,
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
await writeEvidenceDiagnostic({ ...input, diagnostic: next });
|
|
95
|
-
const auditPath = path.join(resolveOperatingPaths(input.projectRoot, { localRoot: input.localRoot }).quarantine, 'classification-audit.jsonl');
|
|
96
|
-
await mkdir(path.dirname(auditPath), { recursive: true, mode: 0o700 });
|
|
97
|
-
await appendFile(auditPath, `${canonicalize({
|
|
98
|
-
candidateId: diagnostic.candidateId,
|
|
99
|
-
status: input.status,
|
|
100
|
-
ruleId: diagnostic.ruleId,
|
|
101
|
-
contentDigest: diagnostic.contentDigest,
|
|
102
|
-
projectHead: diagnostic.projectHead,
|
|
103
|
-
reasonDigest: canonicalDigest(reason),
|
|
104
|
-
confirmationDigest: accepted.confirmationDigest,
|
|
105
|
-
classifiedAt,
|
|
106
|
-
classifiedBy: input.classifiedBy,
|
|
107
|
-
valueDisclosed: false,
|
|
108
|
-
})}\n`, { mode: 0o600 });
|
|
109
|
-
return { state: 'classified', diagnostic: next };
|
|
110
|
-
}
|
|
111
|
-
export async function purgeStaleEvidenceClassifications(input) {
|
|
112
|
-
const bindings = await currentGuidedSessionBindings(input.projectRoot);
|
|
113
|
-
const diagnostics = await listEvidenceDiagnostics(input);
|
|
114
|
-
let stale = 0;
|
|
115
|
-
let purged = 0;
|
|
116
|
-
for (const diagnostic of diagnostics) {
|
|
117
|
-
if (!diagnostic.classification || diagnostic.projectHead === bindings.projectHead)
|
|
118
|
-
continue;
|
|
119
|
-
stale += 1;
|
|
120
|
-
if (!input.purge)
|
|
121
|
-
continue;
|
|
122
|
-
const { classification: _classification, ...current } = diagnostic;
|
|
123
|
-
await writeEvidenceDiagnostic({
|
|
124
|
-
projectRoot: input.projectRoot,
|
|
125
|
-
localRoot: input.localRoot,
|
|
126
|
-
diagnostic: current,
|
|
127
|
-
});
|
|
128
|
-
purged += 1;
|
|
129
|
-
}
|
|
130
|
-
return { stale, purged };
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=evidence-classifications.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-classifications.js","sourceRoot":"","sources":["../../../src/services/operate/evidence-classifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { SecretDetectionMetadata } from './redaction.js';
|
|
2
|
-
import { type CollectedEvidenceItem, type EvidenceDiagnostic } from './types.js';
|
|
3
|
-
export declare function createEvidenceDiagnostic(input: {
|
|
4
|
-
projectRoot: string;
|
|
5
|
-
item: CollectedEvidenceItem;
|
|
6
|
-
detection: SecretDetectionMetadata;
|
|
7
|
-
localRoot?: string;
|
|
8
|
-
}): Promise<EvidenceDiagnostic>;
|
|
9
|
-
export declare function readEvidenceDiagnostic(input: {
|
|
10
|
-
projectRoot: string;
|
|
11
|
-
candidateId: string;
|
|
12
|
-
localRoot?: string;
|
|
13
|
-
}): Promise<EvidenceDiagnostic>;
|
|
14
|
-
export declare function listEvidenceDiagnostics(input: {
|
|
15
|
-
projectRoot: string;
|
|
16
|
-
localRoot?: string;
|
|
17
|
-
}): Promise<EvidenceDiagnostic[]>;
|
|
18
|
-
export declare function writeEvidenceDiagnostic(input: {
|
|
19
|
-
projectRoot: string;
|
|
20
|
-
diagnostic: EvidenceDiagnostic;
|
|
21
|
-
localRoot?: string;
|
|
22
|
-
}): Promise<void>;
|
|
23
|
-
//# sourceMappingURL=evidence-diagnostics.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence-diagnostics.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAgB,MAAM,YAAY,CAAC;AA4D/F,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,uBAAuB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwE9B;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAa9B;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAehC;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, readdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { resolveGuidedInteractionValidators } from '../pipeline-package-service.js';
|
|
4
|
-
import { canonicalDigest, canonicalize, sha256Digest } from './canonical.js';
|
|
5
|
-
import { createOperatingAction } from './interaction/action-service.js';
|
|
6
|
-
import { currentGuidedSessionBindings } from './interaction/session-service.js';
|
|
7
|
-
import { OperateError } from './types.js';
|
|
8
|
-
import { resolveOperatingPaths } from './workspace.js';
|
|
9
|
-
const CANDIDATE_ID = /^EVC-[A-Za-z0-9._-]{8,128}$/;
|
|
10
|
-
function diagnosticDirectory(projectRoot, localRoot) {
|
|
11
|
-
return path.join(resolveOperatingPaths(projectRoot, { localRoot }).quarantine, 'diagnostics');
|
|
12
|
-
}
|
|
13
|
-
function diagnosticPath(projectRoot, candidateId, localRoot) {
|
|
14
|
-
if (!CANDIDATE_ID.test(candidateId)) {
|
|
15
|
-
throw new OperateError('E_OPERATE_CONFIG_INVALID', 'Evidence candidate ID is invalid.');
|
|
16
|
-
}
|
|
17
|
-
return path.join(diagnosticDirectory(projectRoot, localRoot), `${candidateId}.json`);
|
|
18
|
-
}
|
|
19
|
-
function diagnosticSource(item) {
|
|
20
|
-
if (item.source === 'file-import') {
|
|
21
|
-
return item.location.toLowerCase().endsWith('.csv') ? 'import-csv' : 'import-json';
|
|
22
|
-
}
|
|
23
|
-
if (['repository', 'planr', 'git', 'github', 'linear'].includes(item.source)) {
|
|
24
|
-
return item.source;
|
|
25
|
-
}
|
|
26
|
-
return 'repository';
|
|
27
|
-
}
|
|
28
|
-
function safeLocation(item) {
|
|
29
|
-
const value = item.location.replaceAll('\\', '/').trim();
|
|
30
|
-
if (!value ||
|
|
31
|
-
path.posix.isAbsolute(value) ||
|
|
32
|
-
/^[A-Za-z]:\//.test(value) ||
|
|
33
|
-
value.split('/').includes('..') ||
|
|
34
|
-
/(?:\/Users\/|\/home\/|[A-Za-z]:\/Users\/)/i.test(value)) {
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
return value.slice(0, 4_096);
|
|
38
|
-
}
|
|
39
|
-
async function atomicDiagnosticWrite(projectRoot, diagnostic, localRoot) {
|
|
40
|
-
const validators = await resolveGuidedInteractionValidators();
|
|
41
|
-
if (validators.validateEvidenceDiagnostic(diagnostic).length > 0) {
|
|
42
|
-
throw new OperateError('E_OPERATE_CONFIG_INVALID', `Evidence diagnostic ${diagnostic.candidateId} failed Protocol v1.2 validation.`);
|
|
43
|
-
}
|
|
44
|
-
const target = diagnosticPath(projectRoot, diagnostic.candidateId, localRoot);
|
|
45
|
-
await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
|
|
46
|
-
const temporary = `${target}.${process.pid}.tmp`;
|
|
47
|
-
await writeFile(temporary, `${canonicalize(diagnostic)}\n`, { mode: 0o600 });
|
|
48
|
-
await rename(temporary, target);
|
|
49
|
-
await chmod(target, 0o600);
|
|
50
|
-
}
|
|
51
|
-
export async function createEvidenceDiagnostic(input) {
|
|
52
|
-
const bindings = await currentGuidedSessionBindings(input.projectRoot);
|
|
53
|
-
const contentDigest = sha256Digest(input.item.content);
|
|
54
|
-
const candidateId = `EVC-${canonicalDigest({
|
|
55
|
-
source: input.item.source,
|
|
56
|
-
componentId: input.item.repository?.componentId ?? 'control',
|
|
57
|
-
location: input.item.location,
|
|
58
|
-
line: input.detection.line,
|
|
59
|
-
ruleId: input.detection.ruleId,
|
|
60
|
-
contentDigest,
|
|
61
|
-
projectHead: bindings.projectHead,
|
|
62
|
-
}).slice('sha256:'.length, 'sha256:'.length + 24)}`;
|
|
63
|
-
const componentId = input.item.repository?.componentId ?? 'control';
|
|
64
|
-
const diagnose = await createOperatingAction({
|
|
65
|
-
id: 'operate.evidence.diagnose',
|
|
66
|
-
label: 'Inspect the safe evidence diagnostic',
|
|
67
|
-
command: `planr operate evidence diagnose ${candidateId}`,
|
|
68
|
-
effect: 'read-only',
|
|
69
|
-
recommended: true,
|
|
70
|
-
});
|
|
71
|
-
const classify = await createOperatingAction({
|
|
72
|
-
id: 'operate.evidence.classify',
|
|
73
|
-
label: 'Review an eligible exact false-positive classification',
|
|
74
|
-
command: `planr operate evidence classify ${candidateId}`,
|
|
75
|
-
effect: 'machine-local-write',
|
|
76
|
-
confirmation: {
|
|
77
|
-
sessionId: `GIS-evidence-${candidateId.slice('EVC-'.length)}`,
|
|
78
|
-
confirmationScope: `operate.evidence.classify:${candidateId}`,
|
|
79
|
-
projectIdentity: bindings.projectIdentity,
|
|
80
|
-
projectHead: bindings.projectHead,
|
|
81
|
-
configHead: bindings.configHead,
|
|
82
|
-
eventHead: null,
|
|
83
|
-
arguments: [
|
|
84
|
-
input.detection.ruleId,
|
|
85
|
-
contentDigest,
|
|
86
|
-
canonicalDigest({ location: safeLocation(input.item) ?? null }),
|
|
87
|
-
],
|
|
88
|
-
destinations: [],
|
|
89
|
-
writes: [`evidence-diagnostics/${candidateId}.json`],
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
const diagnostic = {
|
|
93
|
-
kind: 'evidence-diagnostic',
|
|
94
|
-
schemaVersion: '1.0.0',
|
|
95
|
-
protocolVersion: '1.2.0',
|
|
96
|
-
candidateId,
|
|
97
|
-
source: diagnosticSource(input.item),
|
|
98
|
-
componentId,
|
|
99
|
-
...(safeLocation(input.item) ? { location: safeLocation(input.item) } : {}),
|
|
100
|
-
...(Number.isInteger(input.detection.line) ? { line: input.detection.line } : {}),
|
|
101
|
-
ruleId: input.detection.ruleId,
|
|
102
|
-
category: input.detection.category,
|
|
103
|
-
contentDigest,
|
|
104
|
-
projectHead: bindings.projectHead,
|
|
105
|
-
valueDisclosed: false,
|
|
106
|
-
actions: [diagnose.action, classify.action],
|
|
107
|
-
};
|
|
108
|
-
const existing = await readEvidenceDiagnostic({
|
|
109
|
-
projectRoot: input.projectRoot,
|
|
110
|
-
candidateId,
|
|
111
|
-
localRoot: input.localRoot,
|
|
112
|
-
}).catch(() => null);
|
|
113
|
-
if (existing &&
|
|
114
|
-
existing.ruleId === diagnostic.ruleId &&
|
|
115
|
-
existing.contentDigest === diagnostic.contentDigest &&
|
|
116
|
-
existing.projectHead === diagnostic.projectHead) {
|
|
117
|
-
return existing;
|
|
118
|
-
}
|
|
119
|
-
await atomicDiagnosticWrite(input.projectRoot, diagnostic, input.localRoot);
|
|
120
|
-
return diagnostic;
|
|
121
|
-
}
|
|
122
|
-
export async function readEvidenceDiagnostic(input) {
|
|
123
|
-
const target = diagnosticPath(input.projectRoot, input.candidateId, input.localRoot);
|
|
124
|
-
try {
|
|
125
|
-
const diagnostic = JSON.parse(await readFile(target, 'utf8'));
|
|
126
|
-
const validators = await resolveGuidedInteractionValidators();
|
|
127
|
-
if (validators.validateEvidenceDiagnostic(diagnostic).length > 0)
|
|
128
|
-
throw new Error('invalid');
|
|
129
|
-
return diagnostic;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
throw new OperateError('E_OPERATE_STATE_INVALID', `Evidence diagnostic ${input.candidateId} is unavailable or invalid.`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export async function listEvidenceDiagnostics(input) {
|
|
136
|
-
const directory = diagnosticDirectory(input.projectRoot, input.localRoot);
|
|
137
|
-
const names = (await readdir(directory).catch(() => []))
|
|
138
|
-
.filter((name) => /^EVC-[A-Za-z0-9._-]+\.json$/.test(name))
|
|
139
|
-
.sort();
|
|
140
|
-
const diagnostics = [];
|
|
141
|
-
for (const name of names) {
|
|
142
|
-
diagnostics.push(await readEvidenceDiagnostic({
|
|
143
|
-
...input,
|
|
144
|
-
candidateId: name.slice(0, -'.json'.length),
|
|
145
|
-
}));
|
|
146
|
-
}
|
|
147
|
-
return diagnostics;
|
|
148
|
-
}
|
|
149
|
-
export async function writeEvidenceDiagnostic(input) {
|
|
150
|
-
await atomicDiagnosticWrite(input.projectRoot, input.diagnostic, input.localRoot);
|
|
151
|
-
}
|
|
152
|
-
//# sourceMappingURL=evidence-diagnostics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-diagnostics.js","sourceRoot":"","sources":["../../../src/services/operate/evidence-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type OperatingEvidence, type OperatingEvidenceReadiness, type OperatingRoleId } from './types.js';
|
|
2
|
-
export declare function evaluateEvidenceReadiness(input: {
|
|
3
|
-
cycleId: string;
|
|
4
|
-
evidence: OperatingEvidence;
|
|
5
|
-
enabledRoles: OperatingRoleId[];
|
|
6
|
-
now?: Date;
|
|
7
|
-
}): Promise<OperatingEvidenceReadiness>;
|
|
8
|
-
//# sourceMappingURL=evidence-readiness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-readiness.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence-readiness.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAgBpB,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA8FtC"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { canonicalDigest } from './canonical.js';
|
|
2
|
-
import { assertOperatingArtifact, loadOperatingProtocol } from './protocol.js';
|
|
3
|
-
import { compareSensitivity, prepareAdvisorEvidenceText } from './redaction.js';
|
|
4
|
-
import { OPERATE_PROTOCOL_VERSION, OPERATE_SCHEMA_VERSION, } from './types.js';
|
|
5
|
-
function ageHours(iso, now) {
|
|
6
|
-
return Math.max(0, (now.getTime() - Date.parse(iso)) / (60 * 60 * 1_000));
|
|
7
|
-
}
|
|
8
|
-
export async function evaluateEvidenceReadiness(input) {
|
|
9
|
-
const now = input.now ?? new Date();
|
|
10
|
-
const registry = (await loadOperatingProtocol()).listOperatingRoles();
|
|
11
|
-
const eligibleItems = input.evidence.items.filter((item) => !prepareAdvisorEvidenceText({
|
|
12
|
-
evidenceId: item.id,
|
|
13
|
-
digest: item.digest,
|
|
14
|
-
value: item.summary ?? '',
|
|
15
|
-
}).quarantined);
|
|
16
|
-
let gapNumber = 1;
|
|
17
|
-
const roles = input.enabledRoles.map((roleId) => {
|
|
18
|
-
const role = registry.find((entry) => entry.id === roleId);
|
|
19
|
-
const configured = role?.minimumEvidence.requirements ?? [
|
|
20
|
-
{
|
|
21
|
-
source: 'repository',
|
|
22
|
-
claimTypes: ['code'],
|
|
23
|
-
minimumItems: 1,
|
|
24
|
-
maxAgeHours: 168,
|
|
25
|
-
observationWindow: 'current-state',
|
|
26
|
-
sensitivityCeiling: 'internal',
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
const requirements = configured.map((requirement) => {
|
|
30
|
-
const matching = eligibleItems.filter((item) => item.source === requirement.source &&
|
|
31
|
-
requirement.claimTypes.some((claim) => item.claimTypes.includes(claim)) &&
|
|
32
|
-
compareSensitivity(item.sensitivity, requirement.sensitivityCeiling) <= 0);
|
|
33
|
-
const oldestAgeHours = matching.length > 0
|
|
34
|
-
? Math.max(...matching.map((item) => ageHours(item.collectedAt, now)))
|
|
35
|
-
: null;
|
|
36
|
-
const satisfied = matching.length >= requirement.minimumItems &&
|
|
37
|
-
oldestAgeHours !== null &&
|
|
38
|
-
oldestAgeHours <= requirement.maxAgeHours &&
|
|
39
|
-
(requirement.observationWindow === 'current-state' ||
|
|
40
|
-
requirement.observationWindow === 'current-cycle' ||
|
|
41
|
-
matching.some((item) => item.observedFrom && item.observedTo));
|
|
42
|
-
return {
|
|
43
|
-
...structuredClone(requirement),
|
|
44
|
-
observedItems: matching.length,
|
|
45
|
-
oldestAgeHours,
|
|
46
|
-
satisfied,
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
const ready = (role?.minimumEvidence.match ?? 'all') === 'any'
|
|
50
|
-
? requirements.some((requirement) => requirement.satisfied)
|
|
51
|
-
: requirements.every((requirement) => requirement.satisfied);
|
|
52
|
-
const gapId = ready ? null : `GAP-${String(gapNumber++).padStart(3, '0')}`;
|
|
53
|
-
return {
|
|
54
|
-
roleId,
|
|
55
|
-
readiness: ready ? 'ready' : 'not_evaluated',
|
|
56
|
-
requirements,
|
|
57
|
-
missingEvidence: requirements
|
|
58
|
-
.filter((requirement) => !requirement.satisfied)
|
|
59
|
-
.map((requirement) => `${requirement.source}:${requirement.claimTypes.join('+')} (${requirement.observedItems}/${requirement.minimumItems})`),
|
|
60
|
-
evidenceRefs: eligibleItems
|
|
61
|
-
.filter((item) => requirements.some((requirement) => requirement.source === item.source &&
|
|
62
|
-
requirement.claimTypes.some((claim) => item.claimTypes.includes(claim))))
|
|
63
|
-
.map((item) => item.id)
|
|
64
|
-
.sort(),
|
|
65
|
-
modelCallAllowed: ready,
|
|
66
|
-
gapId,
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
const readiness = {
|
|
70
|
-
kind: 'operating-evidence-readiness',
|
|
71
|
-
schemaVersion: OPERATE_SCHEMA_VERSION,
|
|
72
|
-
protocolVersion: OPERATE_PROTOCOL_VERSION,
|
|
73
|
-
cycleId: input.cycleId,
|
|
74
|
-
inputDigest: canonicalDigest({
|
|
75
|
-
evidence: input.evidence.fingerprint,
|
|
76
|
-
roles: input.enabledRoles,
|
|
77
|
-
advisorEligibleEvidenceRefs: eligibleItems.map((item) => item.id).sort(),
|
|
78
|
-
}),
|
|
79
|
-
evaluatedAt: now.toISOString(),
|
|
80
|
-
roles,
|
|
81
|
-
};
|
|
82
|
-
return assertOperatingArtifact('operating-evidence-readiness', readiness);
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=evidence-readiness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-readiness.js","sourceRoot":"","sources":["../../../src/services/operate/evidence-readiness.ts"],"names":[],"mappings":"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"}
|