compfn 0.1.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 (134) hide show
  1. package/README.md +705 -0
  2. package/cli/dist/commands/attest.d.ts +7 -0
  3. package/cli/dist/commands/attest.d.ts.map +1 -0
  4. package/cli/dist/commands/attest.js +26 -0
  5. package/cli/dist/commands/attest.js.map +1 -0
  6. package/cli/dist/commands/export.d.ts +6 -0
  7. package/cli/dist/commands/export.d.ts.map +1 -0
  8. package/cli/dist/commands/export.js +30 -0
  9. package/cli/dist/commands/export.js.map +1 -0
  10. package/cli/dist/commands/init.d.ts +4 -0
  11. package/cli/dist/commands/init.d.ts.map +1 -0
  12. package/cli/dist/commands/init.js +22 -0
  13. package/cli/dist/commands/init.js.map +1 -0
  14. package/cli/dist/commands/run-checks.d.ts +5 -0
  15. package/cli/dist/commands/run-checks.d.ts.map +1 -0
  16. package/cli/dist/commands/run-checks.js +53 -0
  17. package/cli/dist/commands/run-checks.js.map +1 -0
  18. package/cli/dist/config.d.ts +7 -0
  19. package/cli/dist/config.d.ts.map +1 -0
  20. package/cli/dist/config.js +28 -0
  21. package/cli/dist/config.js.map +1 -0
  22. package/cli/dist/index.d.ts +3 -0
  23. package/cli/dist/index.d.ts.map +1 -0
  24. package/cli/dist/index.js +39 -0
  25. package/cli/dist/index.js.map +1 -0
  26. package/dist/adapters/authfn.d.ts +43 -0
  27. package/dist/adapters/authfn.d.ts.map +1 -0
  28. package/dist/adapters/authfn.js +67 -0
  29. package/dist/adapters/authfn.js.map +1 -0
  30. package/dist/adapters/secfn.d.ts +44 -0
  31. package/dist/adapters/secfn.d.ts.map +1 -0
  32. package/dist/adapters/secfn.js +68 -0
  33. package/dist/adapters/secfn.js.map +1 -0
  34. package/dist/adapters/types.d.ts +46 -0
  35. package/dist/adapters/types.d.ts.map +1 -0
  36. package/dist/adapters/types.js +7 -0
  37. package/dist/adapters/types.js.map +1 -0
  38. package/dist/api.d.ts +72 -0
  39. package/dist/api.d.ts.map +1 -0
  40. package/dist/api.js +5 -0
  41. package/dist/api.js.map +1 -0
  42. package/dist/bundles/loader.d.ts +39 -0
  43. package/dist/bundles/loader.d.ts.map +1 -0
  44. package/dist/bundles/loader.js +80 -0
  45. package/dist/bundles/loader.js.map +1 -0
  46. package/dist/check.d.ts +23 -0
  47. package/dist/check.d.ts.map +1 -0
  48. package/dist/check.js +5 -0
  49. package/dist/check.js.map +1 -0
  50. package/dist/checks/service.d.ts +31 -0
  51. package/dist/checks/service.d.ts.map +1 -0
  52. package/dist/checks/service.js +286 -0
  53. package/dist/checks/service.js.map +1 -0
  54. package/dist/compfn.d.ts +9 -0
  55. package/dist/compfn.d.ts.map +1 -0
  56. package/dist/compfn.js +94 -0
  57. package/dist/compfn.js.map +1 -0
  58. package/dist/constants.d.ts +14 -0
  59. package/dist/constants.d.ts.map +1 -0
  60. package/dist/constants.js +14 -0
  61. package/dist/constants.js.map +1 -0
  62. package/dist/control.d.ts +25 -0
  63. package/dist/control.d.ts.map +1 -0
  64. package/dist/control.js +5 -0
  65. package/dist/control.js.map +1 -0
  66. package/dist/controls/service.d.ts +22 -0
  67. package/dist/controls/service.d.ts.map +1 -0
  68. package/dist/controls/service.js +248 -0
  69. package/dist/controls/service.js.map +1 -0
  70. package/dist/errors.d.ts +23 -0
  71. package/dist/errors.d.ts.map +1 -0
  72. package/dist/errors.js +5 -0
  73. package/dist/errors.js.map +1 -0
  74. package/dist/evidence/service.d.ts +34 -0
  75. package/dist/evidence/service.d.ts.map +1 -0
  76. package/dist/evidence/service.js +218 -0
  77. package/dist/evidence/service.js.map +1 -0
  78. package/dist/evidence.d.ts +30 -0
  79. package/dist/evidence.d.ts.map +1 -0
  80. package/dist/evidence.js +20 -0
  81. package/dist/evidence.js.map +1 -0
  82. package/dist/export/service.d.ts +39 -0
  83. package/dist/export/service.d.ts.map +1 -0
  84. package/dist/export/service.js +108 -0
  85. package/dist/export/service.js.map +1 -0
  86. package/dist/export-types.d.ts +18 -0
  87. package/dist/export-types.d.ts.map +1 -0
  88. package/dist/export-types.js +5 -0
  89. package/dist/export-types.js.map +1 -0
  90. package/dist/framework.d.ts +24 -0
  91. package/dist/framework.d.ts.map +1 -0
  92. package/dist/framework.js +5 -0
  93. package/dist/framework.js.map +1 -0
  94. package/dist/frameworks/service.d.ts +22 -0
  95. package/dist/frameworks/service.d.ts.map +1 -0
  96. package/dist/frameworks/service.js +255 -0
  97. package/dist/frameworks/service.js.map +1 -0
  98. package/dist/http/routes.d.ts +4 -0
  99. package/dist/http/routes.d.ts.map +1 -0
  100. package/dist/http/routes.js +256 -0
  101. package/dist/http/routes.js.map +1 -0
  102. package/dist/index.d.ts +22 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +15 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/logger.d.ts +19 -0
  107. package/dist/logger.d.ts.map +1 -0
  108. package/dist/logger.js +39 -0
  109. package/dist/logger.js.map +1 -0
  110. package/dist/readiness/service.d.ts +34 -0
  111. package/dist/readiness/service.d.ts.map +1 -0
  112. package/dist/readiness/service.js +160 -0
  113. package/dist/readiness/service.js.map +1 -0
  114. package/dist/readiness.d.ts +18 -0
  115. package/dist/readiness.d.ts.map +1 -0
  116. package/dist/readiness.js +5 -0
  117. package/dist/readiness.js.map +1 -0
  118. package/dist/storage/adapter.d.ts +21 -0
  119. package/dist/storage/adapter.d.ts.map +1 -0
  120. package/dist/storage/adapter.js +37 -0
  121. package/dist/storage/adapter.js.map +1 -0
  122. package/dist/storage/schema.d.ts +14 -0
  123. package/dist/storage/schema.d.ts.map +1 -0
  124. package/dist/storage/schema.js +92 -0
  125. package/dist/storage/schema.js.map +1 -0
  126. package/dist/types.d.ts +12 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +5 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/validation.d.ts +52 -0
  131. package/dist/validation.d.ts.map +1 -0
  132. package/dist/validation.js +550 -0
  133. package/dist/validation.js.map +1 -0
  134. package/package.json +54 -0
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Evidence service: create, get, list (immutable; no update/delete).
3
+ * Validates controlId exists, type in EvidenceType, payload size ≤ evidencePayloadMaxBytes.
4
+ * Returns VALIDATION_FAILED for invalid controlId or type; PAYLOAD_TOO_LARGE when payload exceeds limit.
5
+ */
6
+ import { validateCreateEvidenceInput } from "../validation.js";
7
+ import { EVIDENCE_PAYLOAD_MAX_BYTES_DEFAULT } from "../constants.js";
8
+ import { defaultLogger } from "../logger.js";
9
+ const MODEL = "evidence";
10
+ function defaultNamespace() {
11
+ return "compfn";
12
+ }
13
+ function generateId() {
14
+ return crypto.randomUUID();
15
+ }
16
+ function now() {
17
+ return Date.now();
18
+ }
19
+ function rowToEvidence(row) {
20
+ const evidence = {
21
+ id: String(row.id),
22
+ controlId: String(row.controlId),
23
+ type: String(row.type),
24
+ timestamp: Number(row.timestamp),
25
+ actorId: String(row.actorId),
26
+ outcome: String(row.outcome),
27
+ createdAt: Number(row.createdAt),
28
+ };
29
+ if (row.sourceId != null && row.sourceId !== "") {
30
+ evidence.sourceId = String(row.sourceId);
31
+ }
32
+ if (row.frameworkRequirementId != null && row.frameworkRequirementId !== "") {
33
+ evidence.frameworkRequirementId = String(row.frameworkRequirementId);
34
+ }
35
+ if (row.payload != null && typeof row.payload === "object") {
36
+ evidence.payload = row.payload;
37
+ }
38
+ if (row.artifactRef != null && row.artifactRef !== "") {
39
+ evidence.artifactRef = String(row.artifactRef);
40
+ }
41
+ return evidence;
42
+ }
43
+ export function createEvidenceService(config) {
44
+ const namespace = config.namespace ?? defaultNamespace();
45
+ const maxPayloadBytes = config.evidencePayloadMaxBytes ?? EVIDENCE_PAYLOAD_MAX_BYTES_DEFAULT;
46
+ const logger = config.logger ?? defaultLogger;
47
+ function withNamespace(params) {
48
+ return { ...params, namespace };
49
+ }
50
+ return {
51
+ async create(input) {
52
+ const validation = validateCreateEvidenceInput(input);
53
+ if (!validation.ok) {
54
+ return { ok: false, error: validation.error };
55
+ }
56
+ const value = validation.value;
57
+ const controlExists = await config.existsControl(value.controlId);
58
+ if (!controlExists) {
59
+ return {
60
+ ok: false,
61
+ error: {
62
+ code: "VALIDATION_FAILED",
63
+ message: "Control not found",
64
+ details: { controlId: value.controlId },
65
+ },
66
+ };
67
+ }
68
+ if (value.payload != null) {
69
+ const payloadBytes = new TextEncoder().encode(JSON.stringify(value.payload)).length;
70
+ if (payloadBytes > maxPayloadBytes) {
71
+ return {
72
+ ok: false,
73
+ error: {
74
+ code: "PAYLOAD_TOO_LARGE",
75
+ message: `Payload size ${payloadBytes} exceeds limit ${maxPayloadBytes}`,
76
+ details: { limit: maxPayloadBytes, size: payloadBytes },
77
+ },
78
+ };
79
+ }
80
+ }
81
+ const id = generateId();
82
+ const timestamp = value.timestamp ?? now();
83
+ const createdAt = now();
84
+ const data = {
85
+ id,
86
+ controlId: value.controlId,
87
+ type: value.type,
88
+ timestamp,
89
+ actorId: value.actorId,
90
+ outcome: value.outcome,
91
+ createdAt,
92
+ };
93
+ if (value.sourceId != null)
94
+ data.sourceId = value.sourceId;
95
+ if (value.frameworkRequirementId != null)
96
+ data.frameworkRequirementId = value.frameworkRequirementId;
97
+ if (value.payload != null)
98
+ data.payload = value.payload;
99
+ if (value.artifactRef != null)
100
+ data.artifactRef = value.artifactRef;
101
+ try {
102
+ const created = await config.database.create(withNamespace({ model: MODEL, data }));
103
+ const result = rowToEvidence(created);
104
+ logger.info("evidence.created", {
105
+ event: "evidence.created",
106
+ evidenceId: result.id,
107
+ controlId: result.controlId,
108
+ type: result.type,
109
+ outcome: result.outcome,
110
+ });
111
+ return { ok: true, result };
112
+ }
113
+ catch (err) {
114
+ return {
115
+ ok: false,
116
+ error: {
117
+ code: "STORAGE_ERROR",
118
+ message: err instanceof Error ? err.message : "Storage error",
119
+ details: {},
120
+ },
121
+ };
122
+ }
123
+ },
124
+ async get(id) {
125
+ try {
126
+ const row = await config.database.findOne(withNamespace({
127
+ model: MODEL,
128
+ where: [{ field: "id", operator: "eq", value: id }],
129
+ }));
130
+ if (row == null) {
131
+ return {
132
+ ok: false,
133
+ error: {
134
+ code: "EVIDENCE_NOT_FOUND",
135
+ message: "Evidence not found",
136
+ details: { id },
137
+ },
138
+ };
139
+ }
140
+ return { ok: true, result: rowToEvidence(row) };
141
+ }
142
+ catch (err) {
143
+ return {
144
+ ok: false,
145
+ error: {
146
+ code: "STORAGE_ERROR",
147
+ message: err instanceof Error ? err.message : "Storage error",
148
+ details: { id },
149
+ },
150
+ };
151
+ }
152
+ },
153
+ async list(filters) {
154
+ try {
155
+ let controlIds;
156
+ if (filters.frameworkId != null && filters.frameworkId !== "") {
157
+ const fw = await config.getFramework(filters.frameworkId);
158
+ if (fw == null) {
159
+ return {
160
+ ok: false,
161
+ error: {
162
+ code: "FRAMEWORK_NOT_FOUND",
163
+ message: "Framework not found",
164
+ details: { frameworkId: filters.frameworkId },
165
+ },
166
+ };
167
+ }
168
+ const set = new Set();
169
+ for (const req of fw.requirements) {
170
+ for (const cid of req.controlIds) {
171
+ set.add(cid);
172
+ }
173
+ }
174
+ controlIds = Array.from(set);
175
+ if (filters.controlId != null && filters.controlId !== "") {
176
+ controlIds = set.has(filters.controlId) ? [filters.controlId] : [];
177
+ }
178
+ if (controlIds.length === 0) {
179
+ return { ok: true, result: [] };
180
+ }
181
+ }
182
+ const where = [];
183
+ if (controlIds != null && controlIds.length > 0) {
184
+ where.push({ field: "controlId", operator: "in", value: controlIds });
185
+ }
186
+ else if (filters.controlId != null && filters.controlId !== "") {
187
+ where.push({ field: "controlId", operator: "eq", value: filters.controlId });
188
+ }
189
+ if (filters.type != null && filters.type !== "") {
190
+ where.push({ field: "type", operator: "eq", value: filters.type });
191
+ }
192
+ if (filters.since != null && Number.isFinite(filters.since)) {
193
+ where.push({ field: "timestamp", operator: "gte", value: filters.since });
194
+ }
195
+ const withConnector = where.map((w, i) => ({ ...w, connector: i === 0 ? undefined : "AND" }));
196
+ const params = withNamespace({
197
+ model: MODEL,
198
+ where: withConnector,
199
+ orderBy: [{ field: "createdAt", direction: "desc" }],
200
+ });
201
+ const rows = await config.database.findMany(params);
202
+ const evidence = rows.map((r) => rowToEvidence(r));
203
+ return { ok: true, result: evidence };
204
+ }
205
+ catch (err) {
206
+ return {
207
+ ok: false,
208
+ error: {
209
+ code: "STORAGE_ERROR",
210
+ message: err instanceof Error ? err.message : "Storage error",
211
+ details: {},
212
+ },
213
+ };
214
+ }
215
+ },
216
+ };
217
+ }
218
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/evidence/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Evidence types: EvidenceType, Evidence, CreateEvidenceInput.
3
+ */
4
+ export declare const EVIDENCE_TYPES: readonly string[];
5
+ export type EvidenceType = "automated_secfn" | "automated_authfn" | "automated_logfn" | "automated_watchfn" | "automated_hostfn" | "automated_flowfn" | "automated_filefn" | "automated_plugfn" | "manual_attestation" | "file_upload" | "questionnaire" | "custom_check" | "scoping_decision" | "external_webhook";
6
+ export interface Evidence {
7
+ id: string;
8
+ controlId: string;
9
+ type: EvidenceType;
10
+ sourceId?: string;
11
+ frameworkRequirementId?: string;
12
+ timestamp: number;
13
+ actorId: string;
14
+ outcome: "pass" | "fail" | "unknown";
15
+ payload?: Record<string, unknown>;
16
+ artifactRef?: string;
17
+ createdAt: number;
18
+ }
19
+ export interface CreateEvidenceInput {
20
+ controlId: string;
21
+ type: EvidenceType;
22
+ sourceId?: string;
23
+ frameworkRequirementId?: string;
24
+ timestamp?: number;
25
+ actorId: string;
26
+ outcome: "pass" | "fail" | "unknown";
27
+ payload?: Record<string, unknown>;
28
+ artifactRef?: string;
29
+ }
30
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAelC,CAAC;AAEX,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,GACb,eAAe,GACf,cAAc,GACd,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Evidence types: EvidenceType, Evidence, CreateEvidenceInput.
3
+ */
4
+ export const EVIDENCE_TYPES = [
5
+ "automated_secfn",
6
+ "automated_authfn",
7
+ "automated_logfn",
8
+ "automated_watchfn",
9
+ "automated_hostfn",
10
+ "automated_flowfn",
11
+ "automated_filefn",
12
+ "automated_plugfn",
13
+ "manual_attestation",
14
+ "file_upload",
15
+ "questionnaire",
16
+ "custom_check",
17
+ "scoping_decision",
18
+ "external_webhook",
19
+ ];
20
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,kBAAkB;CACV,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Export service: auditorPack() builds AuditorPack with optional frameworkId/since filters
3
+ * and enforces exportMaxBytes (EXPORT-001, LIMIT-001).
4
+ */
5
+ import type { CompfnEnvelope } from "../errors.js";
6
+ import type { Control } from "../control.js";
7
+ import type { Framework } from "../framework.js";
8
+ import type { Evidence } from "../evidence.js";
9
+ import type { AuditorPack } from "../export-types.js";
10
+ import type { Logger } from "../logger.js";
11
+ export interface ExportServiceConfig {
12
+ /** Load single framework by id */
13
+ getFramework: (id: string) => Promise<CompfnEnvelope<Framework>>;
14
+ /** Load all frameworks */
15
+ listFrameworks: () => Promise<CompfnEnvelope<Framework[]>>;
16
+ /** Load single control by id */
17
+ getControl: (id: string) => Promise<CompfnEnvelope<Control>>;
18
+ /** Load all controls (no filter) or with optional filters */
19
+ listControls: (filters?: {
20
+ category?: string;
21
+ tags?: string[];
22
+ }) => Promise<CompfnEnvelope<Control[]>>;
23
+ /** List evidence with optional controlId, frameworkId, type, since */
24
+ listEvidence: (filters: {
25
+ controlId?: string;
26
+ frameworkId?: string;
27
+ type?: string;
28
+ since?: number;
29
+ }) => Promise<CompfnEnvelope<Evidence[]>>;
30
+ exportMaxBytes?: number;
31
+ logger?: Logger;
32
+ }
33
+ export declare function createExportService(config: ExportServiceConfig): {
34
+ auditorPack(options: {
35
+ frameworkId?: string;
36
+ since?: number;
37
+ }): Promise<CompfnEnvelope<AuditorPack>>;
38
+ };
39
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/export/service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,0BAA0B;IAC1B,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3D,gCAAgC;IAChC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,6DAA6D;IAC7D,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvG,sEAAsE;IACtE,YAAY,EAAE,CAAC,OAAO,EAAE;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB;yBAKhC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;EAsF3C"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Export service: auditorPack() builds AuditorPack with optional frameworkId/since filters
3
+ * and enforces exportMaxBytes (EXPORT-001, LIMIT-001).
4
+ */
5
+ import { EXPORT_MAX_BYTES_DEFAULT } from "../constants.js";
6
+ import { defaultLogger } from "../logger.js";
7
+ /**
8
+ * Build set of control IDs from framework(s) requirements.
9
+ */
10
+ function controlIdsFromFrameworks(frameworks) {
11
+ const set = new Set();
12
+ for (const fw of frameworks) {
13
+ for (const req of fw.requirements) {
14
+ for (const cid of req.controlIds) {
15
+ set.add(cid);
16
+ }
17
+ }
18
+ }
19
+ return set;
20
+ }
21
+ export function createExportService(config) {
22
+ const exportMaxBytes = config.exportMaxBytes ?? EXPORT_MAX_BYTES_DEFAULT;
23
+ const logger = config.logger ?? defaultLogger;
24
+ return {
25
+ async auditorPack(options) {
26
+ logger.info("export.requested", {
27
+ event: "export.requested",
28
+ frameworkId: options.frameworkId,
29
+ });
30
+ // 1) Load frameworks: one by id or all
31
+ let frameworks;
32
+ if (options.frameworkId != null && options.frameworkId !== "") {
33
+ const r = await config.getFramework(options.frameworkId);
34
+ if (!r.ok)
35
+ return r;
36
+ frameworks = [r.result];
37
+ }
38
+ else {
39
+ const r = await config.listFrameworks();
40
+ if (!r.ok)
41
+ return r;
42
+ frameworks = r.result;
43
+ }
44
+ const controlIdSet = controlIdsFromFrameworks(frameworks);
45
+ // 2) Load controls: scoped to framework controlIds or all
46
+ let controls;
47
+ if (options.frameworkId != null && options.frameworkId !== "") {
48
+ controls = [];
49
+ for (const cid of controlIdSet) {
50
+ const r = await config.getControl(cid);
51
+ if (r.ok)
52
+ controls.push(r.result);
53
+ }
54
+ }
55
+ else {
56
+ const r = await config.listControls();
57
+ if (!r.ok)
58
+ return r;
59
+ controls = r.result;
60
+ }
61
+ // 3) Load evidence: optional frameworkId and since
62
+ const evidenceFilters = {};
63
+ if (options.frameworkId != null && options.frameworkId !== "") {
64
+ evidenceFilters.frameworkId = options.frameworkId;
65
+ }
66
+ if (options.since != null && Number.isFinite(options.since)) {
67
+ evidenceFilters.since = options.since;
68
+ }
69
+ const evRes = await config.listEvidence(evidenceFilters);
70
+ if (!evRes.ok)
71
+ return evRes;
72
+ const evidence = evRes.result;
73
+ // 4) Build mapping from framework.requirements
74
+ const mapping = frameworks.flatMap((fw) => fw.requirements.map((req) => ({
75
+ requirementId: req.requirementId,
76
+ controlIds: [...req.controlIds],
77
+ })));
78
+ const result = {
79
+ exportedAt: Date.now(),
80
+ frameworkId: options.frameworkId,
81
+ controls,
82
+ frameworks,
83
+ evidence,
84
+ mapping,
85
+ };
86
+ // 5) Size check
87
+ const serialized = JSON.stringify(result);
88
+ const size = new TextEncoder().encode(serialized).length;
89
+ if (size > exportMaxBytes) {
90
+ return {
91
+ ok: false,
92
+ error: {
93
+ code: "EXPORT_FAILED",
94
+ message: `Export size ${size} exceeds limit ${exportMaxBytes}`,
95
+ details: { size, limit: exportMaxBytes },
96
+ },
97
+ };
98
+ }
99
+ logger.info("export.completed", {
100
+ event: "export.completed",
101
+ frameworkId: options.frameworkId,
102
+ sizeBytes: size,
103
+ });
104
+ return { ok: true, result };
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/export/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Export types: AuditorPack.
3
+ */
4
+ import type { Control } from "./control.js";
5
+ import type { Framework } from "./framework.js";
6
+ import type { Evidence } from "./evidence.js";
7
+ export interface AuditorPack {
8
+ exportedAt: number;
9
+ frameworkId?: string;
10
+ controls: Control[];
11
+ frameworks: Framework[];
12
+ evidence: Evidence[];
13
+ mapping: Array<{
14
+ requirementId: string;
15
+ controlIds: string[];
16
+ }>;
17
+ }
18
+ //# sourceMappingURL=export-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-types.d.ts","sourceRoot":"","sources":["../src/export-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACjE"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Export types: AuditorPack.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=export-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-types.js","sourceRoot":"","sources":["../src/export-types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Framework types: Framework, FrameworkRequirement, CreateFrameworkInput.
3
+ */
4
+ export interface FrameworkRequirement {
5
+ requirementId: string;
6
+ controlIds: string[];
7
+ name?: string;
8
+ }
9
+ export interface Framework {
10
+ id: string;
11
+ name: string;
12
+ version?: string;
13
+ description?: string;
14
+ requirements: FrameworkRequirement[];
15
+ createdAt: number;
16
+ updatedAt: number;
17
+ }
18
+ export interface CreateFrameworkInput {
19
+ name: string;
20
+ version?: string;
21
+ description?: string;
22
+ requirements: FrameworkRequirement[];
23
+ }
24
+ //# sourceMappingURL=framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../src/framework.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Framework types: Framework, FrameworkRequirement, CreateFrameworkInput.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework.js","sourceRoot":"","sources":["../src/framework.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Frameworks CRUD service with requirement/controlId validation (FW-001, FW-002, LIMIT-001).
3
+ * All methods return CompfnEnvelope; FRAMEWORK_NOT_FOUND when id does not exist;
4
+ * VALIDATION_FAILED when requirement controlIds reference nonexistent control or limits exceeded.
5
+ */
6
+ import type { Adapter } from "@superfunctions/db";
7
+ import type { Framework, CreateFrameworkInput } from "../framework.js";
8
+ import type { CompfnEnvelope } from "../errors.js";
9
+ export interface FrameworksServiceConfig {
10
+ database: Adapter;
11
+ namespace?: string;
12
+ /** Check that a control exists by id (e.g. from controls.get(id).then(r => r.ok)) */
13
+ existsControl: (controlId: string) => Promise<boolean>;
14
+ }
15
+ export declare function createFrameworksService(config: FrameworksServiceConfig): {
16
+ create(input: CreateFrameworkInput): Promise<CompfnEnvelope<Framework>>;
17
+ get(id: string): Promise<CompfnEnvelope<Framework>>;
18
+ list(): Promise<CompfnEnvelope<Framework[]>>;
19
+ update(id: string, input: Partial<CreateFrameworkInput>): Promise<CompfnEnvelope<Framework>>;
20
+ delete(id: string): Promise<CompfnEnvelope<void>>;
21
+ };
22
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/frameworks/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EACV,SAAS,EACT,oBAAoB,EAErB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,cAAc,CAAC;AAQhE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxD;AAiED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB;kBAQ/C,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAyC/D,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YA+B3C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;eAuB5C,MAAM,SACH,OAAO,CAAC,oBAAoB,CAAC,GACnC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;eAqEpB,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;EAqC1D"}