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.
Files changed (153) hide show
  1. package/dist/cli/commands/backlog.d.ts.map +1 -1
  2. package/dist/cli/commands/backlog.js +3 -0
  3. package/dist/cli/commands/backlog.js.map +1 -1
  4. package/dist/cli/commands/config.d.ts.map +1 -1
  5. package/dist/cli/commands/config.js +3 -0
  6. package/dist/cli/commands/config.js.map +1 -1
  7. package/dist/cli/commands/epic.d.ts.map +1 -1
  8. package/dist/cli/commands/epic.js +2 -0
  9. package/dist/cli/commands/epic.js.map +1 -1
  10. package/dist/cli/commands/feature.d.ts.map +1 -1
  11. package/dist/cli/commands/feature.js +2 -0
  12. package/dist/cli/commands/feature.js.map +1 -1
  13. package/dist/cli/commands/operate.d.ts +5 -2
  14. package/dist/cli/commands/operate.d.ts.map +1 -1
  15. package/dist/cli/commands/operate.js +10 -101
  16. package/dist/cli/commands/operate.js.map +1 -1
  17. package/dist/cli/commands/plan.d.ts.map +1 -1
  18. package/dist/cli/commands/plan.js +2 -0
  19. package/dist/cli/commands/plan.js.map +1 -1
  20. package/dist/cli/commands/quick.d.ts.map +1 -1
  21. package/dist/cli/commands/quick.js +2 -0
  22. package/dist/cli/commands/quick.js.map +1 -1
  23. package/dist/cli/commands/refine.d.ts.map +1 -1
  24. package/dist/cli/commands/refine.js +2 -0
  25. package/dist/cli/commands/refine.js.map +1 -1
  26. package/dist/cli/commands/revise.d.ts.map +1 -1
  27. package/dist/cli/commands/revise.js +2 -0
  28. package/dist/cli/commands/revise.js.map +1 -1
  29. package/dist/cli/commands/spec.d.ts.map +1 -1
  30. package/dist/cli/commands/spec.js +2 -0
  31. package/dist/cli/commands/spec.js.map +1 -1
  32. package/dist/cli/commands/sprint.d.ts.map +1 -1
  33. package/dist/cli/commands/sprint.js +2 -0
  34. package/dist/cli/commands/sprint.js.map +1 -1
  35. package/dist/cli/commands/story.d.ts.map +1 -1
  36. package/dist/cli/commands/story.js +3 -0
  37. package/dist/cli/commands/story.js.map +1 -1
  38. package/dist/cli/commands/task.d.ts.map +1 -1
  39. package/dist/cli/commands/task.js +3 -0
  40. package/dist/cli/commands/task.js.map +1 -1
  41. package/dist/services/ai-service.d.ts +3 -5
  42. package/dist/services/ai-service.d.ts.map +1 -1
  43. package/dist/services/ai-service.js +7 -1
  44. package/dist/services/ai-service.js.map +1 -1
  45. package/dist/services/credentials-service.d.ts.map +1 -1
  46. package/dist/services/credentials-service.js +2 -0
  47. package/dist/services/credentials-service.js.map +1 -1
  48. package/dist/services/deprecation-notices.d.ts +5 -0
  49. package/dist/services/deprecation-notices.d.ts.map +1 -0
  50. package/dist/services/deprecation-notices.js +6 -0
  51. package/dist/services/deprecation-notices.js.map +1 -0
  52. package/dist/services/operate/advisors.d.ts +146 -108
  53. package/dist/services/operate/advisors.d.ts.map +1 -1
  54. package/dist/services/operate/advisors.js +178 -448
  55. package/dist/services/operate/advisors.js.map +1 -1
  56. package/dist/services/operate/citation-resolution.d.ts.map +1 -1
  57. package/dist/services/operate/citation-resolution.js +50 -1
  58. package/dist/services/operate/citation-resolution.js.map +1 -1
  59. package/dist/services/operate/config.d.ts +28 -52
  60. package/dist/services/operate/config.d.ts.map +1 -1
  61. package/dist/services/operate/config.js +68 -203
  62. package/dist/services/operate/config.js.map +1 -1
  63. package/dist/services/operate/doctor.d.ts +15 -0
  64. package/dist/services/operate/doctor.d.ts.map +1 -1
  65. package/dist/services/operate/doctor.js +142 -32
  66. package/dist/services/operate/doctor.js.map +1 -1
  67. package/dist/services/operate/engine.d.ts +22 -62
  68. package/dist/services/operate/engine.d.ts.map +1 -1
  69. package/dist/services/operate/engine.js +269 -191
  70. package/dist/services/operate/engine.js.map +1 -1
  71. package/dist/services/operate/evidence.d.ts +9 -78
  72. package/dist/services/operate/evidence.d.ts.map +1 -1
  73. package/dist/services/operate/evidence.js +0 -1194
  74. package/dist/services/operate/evidence.js.map +1 -1
  75. package/dist/services/operate/index.d.ts.map +1 -1
  76. package/dist/services/operate/index.js +15 -231
  77. package/dist/services/operate/index.js.map +1 -1
  78. package/dist/services/operate/integrity.d.ts +81 -0
  79. package/dist/services/operate/integrity.d.ts.map +1 -0
  80. package/dist/services/operate/integrity.js +152 -0
  81. package/dist/services/operate/integrity.js.map +1 -0
  82. package/dist/services/operate/interaction/answer-service.d.ts +0 -10
  83. package/dist/services/operate/interaction/answer-service.d.ts.map +1 -1
  84. package/dist/services/operate/interaction/answer-service.js +63 -43
  85. package/dist/services/operate/interaction/answer-service.js.map +1 -1
  86. package/dist/services/operate/interaction/question-engine.d.ts.map +1 -1
  87. package/dist/services/operate/interaction/question-engine.js +105 -21
  88. package/dist/services/operate/interaction/question-engine.js.map +1 -1
  89. package/dist/services/operate/interaction/question-registry.d.ts +16 -1
  90. package/dist/services/operate/interaction/question-registry.d.ts.map +1 -1
  91. package/dist/services/operate/interaction/question-registry.js +45 -39
  92. package/dist/services/operate/interaction/question-registry.js.map +1 -1
  93. package/dist/services/operate/interaction/session-service.d.ts.map +1 -1
  94. package/dist/services/operate/interaction/session-service.js +16 -11
  95. package/dist/services/operate/interaction/session-service.js.map +1 -1
  96. package/dist/services/operate/interaction/terminal-renderer.d.ts.map +1 -1
  97. package/dist/services/operate/interaction/terminal-renderer.js +16 -6
  98. package/dist/services/operate/interaction/terminal-renderer.js.map +1 -1
  99. package/dist/services/operate/lifecycle.d.ts.map +1 -1
  100. package/dist/services/operate/lifecycle.js +17 -1
  101. package/dist/services/operate/lifecycle.js.map +1 -1
  102. package/dist/services/operate/maintenance.d.ts.map +1 -1
  103. package/dist/services/operate/maintenance.js +95 -276
  104. package/dist/services/operate/maintenance.js.map +1 -1
  105. package/dist/services/operate/mission-dispatch.d.ts +73 -55
  106. package/dist/services/operate/mission-dispatch.d.ts.map +1 -1
  107. package/dist/services/operate/mission-dispatch.js +91 -67
  108. package/dist/services/operate/mission-dispatch.js.map +1 -1
  109. package/dist/services/operate/projection-persistence.d.ts +35 -7
  110. package/dist/services/operate/projection-persistence.d.ts.map +1 -1
  111. package/dist/services/operate/projection-persistence.js +142 -53
  112. package/dist/services/operate/projection-persistence.js.map +1 -1
  113. package/dist/services/operate/projection.d.ts +9 -1
  114. package/dist/services/operate/projection.d.ts.map +1 -1
  115. package/dist/services/operate/projection.js +22 -12
  116. package/dist/services/operate/projection.js.map +1 -1
  117. package/dist/services/operate/protocol.d.ts +1 -41
  118. package/dist/services/operate/protocol.d.ts.map +1 -1
  119. package/dist/services/operate/protocol.js +7 -45
  120. package/dist/services/operate/protocol.js.map +1 -1
  121. package/dist/services/operate/redaction.d.ts +3 -3
  122. package/dist/services/operate/redaction.js +4 -4
  123. package/dist/services/operate/redaction.js.map +1 -1
  124. package/dist/services/operate/reports.d.ts +20 -1
  125. package/dist/services/operate/reports.d.ts.map +1 -1
  126. package/dist/services/operate/reports.js +108 -4
  127. package/dist/services/operate/reports.js.map +1 -1
  128. package/dist/services/operate/routes.d.ts +84 -0
  129. package/dist/services/operate/routes.d.ts.map +1 -1
  130. package/dist/services/operate/routes.js +519 -10
  131. package/dist/services/operate/routes.js.map +1 -1
  132. package/dist/services/operate/types.d.ts +48 -133
  133. package/dist/services/operate/types.d.ts.map +1 -1
  134. package/dist/services/operate/types.js.map +1 -1
  135. package/dist/services/operate/workspace.d.ts +0 -1
  136. package/dist/services/operate/workspace.d.ts.map +1 -1
  137. package/dist/services/operate/workspace.js +0 -2
  138. package/dist/services/operate/workspace.js.map +1 -1
  139. package/dist/services/runtime-manager-service.js +2 -2
  140. package/dist/services/runtime-manager-service.js.map +1 -1
  141. package/package.json +3 -3
  142. package/dist/services/operate/evidence-classifications.d.ts +0 -59
  143. package/dist/services/operate/evidence-classifications.d.ts.map +0 -1
  144. package/dist/services/operate/evidence-classifications.js +0 -132
  145. package/dist/services/operate/evidence-classifications.js.map +0 -1
  146. package/dist/services/operate/evidence-diagnostics.d.ts +0 -23
  147. package/dist/services/operate/evidence-diagnostics.d.ts.map +0 -1
  148. package/dist/services/operate/evidence-diagnostics.js +0 -152
  149. package/dist/services/operate/evidence-diagnostics.js.map +0 -1
  150. package/dist/services/operate/evidence-readiness.d.ts +0 -8
  151. package/dist/services/operate/evidence-readiness.d.ts.map +0 -1
  152. package/dist/services/operate/evidence-readiness.js +0 -84
  153. 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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"}