@x12i/map-store-client 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -1
- package/dist/estate/analytics.d.ts +50 -0
- package/dist/estate/analytics.d.ts.map +1 -0
- package/dist/estate/analytics.js +128 -0
- package/dist/estate/analytics.js.map +1 -0
- package/dist/estate/census.d.ts +123 -0
- package/dist/estate/census.d.ts.map +1 -0
- package/dist/estate/census.js +275 -0
- package/dist/estate/census.js.map +1 -0
- package/dist/estate/client.d.ts +66 -0
- package/dist/estate/client.d.ts.map +1 -0
- package/dist/estate/client.js +10 -0
- package/dist/estate/client.js.map +1 -0
- package/dist/estate/content.d.ts +91 -0
- package/dist/estate/content.d.ts.map +1 -0
- package/dist/estate/content.js +251 -0
- package/dist/estate/content.js.map +1 -0
- package/dist/estate/contract.d.ts +76 -0
- package/dist/estate/contract.d.ts.map +1 -0
- package/dist/estate/contract.js +291 -0
- package/dist/estate/contract.js.map +1 -0
- package/dist/estate/decisions.d.ts +32 -0
- package/dist/estate/decisions.d.ts.map +1 -0
- package/dist/estate/decisions.js +113 -0
- package/dist/estate/decisions.js.map +1 -0
- package/dist/estate/ids.d.ts +3 -0
- package/dist/estate/ids.d.ts.map +1 -0
- package/dist/estate/ids.js +6 -0
- package/dist/estate/ids.js.map +1 -0
- package/dist/estate/index.d.ts +30 -0
- package/dist/estate/index.d.ts.map +1 -0
- package/dist/estate/index.js +19 -0
- package/dist/estate/index.js.map +1 -0
- package/dist/estate/localStories.d.ts +28 -0
- package/dist/estate/localStories.d.ts.map +1 -0
- package/dist/estate/localStories.js +980 -0
- package/dist/estate/localStories.js.map +1 -0
- package/dist/estate/pack.d.ts +45 -0
- package/dist/estate/pack.d.ts.map +1 -0
- package/dist/estate/pack.js +83 -0
- package/dist/estate/pack.js.map +1 -0
- package/dist/estate/predictedAttack.d.ts +79 -0
- package/dist/estate/predictedAttack.d.ts.map +1 -0
- package/dist/estate/predictedAttack.js +321 -0
- package/dist/estate/predictedAttack.js.map +1 -0
- package/dist/estate/readState.d.ts +33 -0
- package/dist/estate/readState.d.ts.map +1 -0
- package/dist/estate/readState.js +58 -0
- package/dist/estate/readState.js.map +1 -0
- package/dist/estate/stories.d.ts +93 -0
- package/dist/estate/stories.d.ts.map +1 -0
- package/dist/estate/stories.js +224 -0
- package/dist/estate/stories.js.map +1 -0
- package/dist/estate/verdictReason.d.ts +17 -0
- package/dist/estate/verdictReason.d.ts.map +1 -0
- package/dist/estate/verdictReason.js +49 -0
- package/dist/estate/verdictReason.js.map +1 -0
- package/dist/fetch.d.ts +2 -0
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +13 -3
- package/dist/fetch.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/queries.d.ts +98 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +180 -0
- package/dist/queries.js.map +1 -0
- package/package.json +14 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memorix content reads behind the lists.
|
|
3
|
+
* Business fields live on `record.data`. Narrative text lives on `_markdown.content`.
|
|
4
|
+
* The scope reason lives on the envelope `_metadata`, so each row carries it out.
|
|
5
|
+
*/
|
|
6
|
+
import { requiredDiscriminator } from './pack';
|
|
7
|
+
import { classifyReadError, isPlaceholderRecord } from './readState';
|
|
8
|
+
function asRecord(value) {
|
|
9
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
10
|
+
? value
|
|
11
|
+
: null;
|
|
12
|
+
}
|
|
13
|
+
function asList(value) {
|
|
14
|
+
return Array.isArray(value) ? value : [];
|
|
15
|
+
}
|
|
16
|
+
function text(value) {
|
|
17
|
+
if (typeof value === 'string')
|
|
18
|
+
return value.trim() || null;
|
|
19
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
20
|
+
return String(value);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/** A Memorix document envelope. Its facts are `data`, never the envelope itself. */
|
|
24
|
+
export function isDocumentEnvelope(value) {
|
|
25
|
+
return value.format === 'memorix-record/2' || '_system' in value || '_markdown' in value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Business fields. Prefer `record.data` or `page.data`.
|
|
29
|
+
* An envelope without `data` is not facts. A flat body that is not an envelope still is.
|
|
30
|
+
*/
|
|
31
|
+
export function contentData(page) {
|
|
32
|
+
const top = asRecord(page);
|
|
33
|
+
if (!top)
|
|
34
|
+
return null;
|
|
35
|
+
const record = asRecord(top.record);
|
|
36
|
+
const nested = asRecord(record?.data) ?? asRecord(top.data);
|
|
37
|
+
if (nested)
|
|
38
|
+
return nested;
|
|
39
|
+
if (record)
|
|
40
|
+
return isDocumentEnvelope(record) ? null : record;
|
|
41
|
+
if (isDocumentEnvelope(top))
|
|
42
|
+
return null;
|
|
43
|
+
return top;
|
|
44
|
+
}
|
|
45
|
+
/** `_markdown.content` on a record or a `{ record }` page. Empty when the head has none. */
|
|
46
|
+
export function documentMarkdown(page) {
|
|
47
|
+
const top = asRecord(page);
|
|
48
|
+
if (!top)
|
|
49
|
+
return null;
|
|
50
|
+
const record = asRecord(top.record) ?? top;
|
|
51
|
+
const markdown = asRecord(record._markdown);
|
|
52
|
+
const content = typeof markdown?.content === 'string' ? markdown.content.trim() : '';
|
|
53
|
+
return content || null;
|
|
54
|
+
}
|
|
55
|
+
function responseToken(value) {
|
|
56
|
+
return String(value ?? '')
|
|
57
|
+
.trim()
|
|
58
|
+
.toUpperCase()
|
|
59
|
+
.replace(/[\s-]+/g, '_');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Envelope `_metadata.scopeReason`, for example `OUTSIDE_SNAPSHOT`.
|
|
63
|
+
* It is not a field inside `data`, so list reads lose it unless it is copied out.
|
|
64
|
+
*/
|
|
65
|
+
export function readScopeReason(envelope) {
|
|
66
|
+
const top = asRecord(envelope);
|
|
67
|
+
if (!top)
|
|
68
|
+
return null;
|
|
69
|
+
const from = (value) => {
|
|
70
|
+
const reason = responseToken(asRecord(asRecord(value)?._metadata)?.scopeReason);
|
|
71
|
+
return reason || null;
|
|
72
|
+
};
|
|
73
|
+
return from(top) ?? from(top.record) ?? from(top.data) ?? null;
|
|
74
|
+
}
|
|
75
|
+
function rowsFrom(page) {
|
|
76
|
+
const top = asRecord(page);
|
|
77
|
+
const list = asList(top?.records ?? top?.items ?? top?.data ?? top?.content ?? page);
|
|
78
|
+
return list.flatMap((raw) => {
|
|
79
|
+
const rec = asRecord(raw);
|
|
80
|
+
if (!rec)
|
|
81
|
+
return [];
|
|
82
|
+
const inner = asRecord(rec.record) ?? rec;
|
|
83
|
+
const data = contentData(inner);
|
|
84
|
+
const recordId = text(inner.recordId) ?? text(inner.id) ?? text(rec.recordId) ?? text(rec.id);
|
|
85
|
+
if (!data || !recordId)
|
|
86
|
+
return [];
|
|
87
|
+
return [{
|
|
88
|
+
recordId,
|
|
89
|
+
data,
|
|
90
|
+
markdown: documentMarkdown(inner),
|
|
91
|
+
scopeReason: readScopeReason(inner) ?? readScopeReason(rec),
|
|
92
|
+
}];
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function nextCursor(page) {
|
|
96
|
+
const top = asRecord(page);
|
|
97
|
+
return text(asRecord(top?.pageInfo)?.nextCursor) ?? text(top?.nextCursor);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Every record of one content type on one object type, following `pageInfo.nextCursor`.
|
|
101
|
+
* `declared-empty` is a 404. `undeclared` is a content type the pack does not register.
|
|
102
|
+
* A placeholder land is `placeholder` and carries no rows. Anything else is `error`.
|
|
103
|
+
*/
|
|
104
|
+
export async function listContentResult(client, input) {
|
|
105
|
+
const rows = [];
|
|
106
|
+
const pageSize = input.pageSize ?? 200;
|
|
107
|
+
const maxPages = input.maxPages ?? 20;
|
|
108
|
+
let cursor;
|
|
109
|
+
for (let page = 0; page < maxPages; page += 1) {
|
|
110
|
+
const query = {
|
|
111
|
+
objectType: input.objectType,
|
|
112
|
+
contentType: input.contentType,
|
|
113
|
+
limit: pageSize,
|
|
114
|
+
cursor,
|
|
115
|
+
filter: input.filter,
|
|
116
|
+
include: input.includeMarkdown ? { markdown: true } : undefined,
|
|
117
|
+
};
|
|
118
|
+
let res;
|
|
119
|
+
try {
|
|
120
|
+
res = await client.listContent(query);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const kind = classifyReadError(err);
|
|
124
|
+
if (kind === 'error')
|
|
125
|
+
return { state: 'error', data: null, error: err };
|
|
126
|
+
if (rows.length > 0)
|
|
127
|
+
return { state: 'ready', data: rows };
|
|
128
|
+
return { state: kind, data: null };
|
|
129
|
+
}
|
|
130
|
+
if (rows.length === 0 && isPlaceholderRecord(res))
|
|
131
|
+
return { state: 'placeholder', data: null };
|
|
132
|
+
rows.push(...rowsFrom(res));
|
|
133
|
+
const next = nextCursor(res);
|
|
134
|
+
if (!next)
|
|
135
|
+
break;
|
|
136
|
+
cursor = next;
|
|
137
|
+
}
|
|
138
|
+
return { state: 'ready', data: rows };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Every record of one content type on one object type, following `pageInfo.nextCursor`.
|
|
142
|
+
* A 404, an undeclared content type, or a placeholder land is an empty list.
|
|
143
|
+
* Anything else is thrown. Use {@link listContentResult} to tell those apart.
|
|
144
|
+
*/
|
|
145
|
+
export async function listContent(client, input) {
|
|
146
|
+
const result = await listContentResult(client, input);
|
|
147
|
+
if (result.state === 'error')
|
|
148
|
+
throw result.error;
|
|
149
|
+
return result.data ?? [];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* One record. Names the discriminator instance when the pack marks it required.
|
|
153
|
+
* `declared-empty` is a miss. `undeclared` means the pack does not register the content type.
|
|
154
|
+
* `placeholder` is a land that occupies the address without a product.
|
|
155
|
+
*/
|
|
156
|
+
export async function readContentResult(data, catalog, input) {
|
|
157
|
+
const required = await requiredDiscriminator(catalog, input.objectType, input.contentType);
|
|
158
|
+
let page;
|
|
159
|
+
try {
|
|
160
|
+
page = await data.getContent({
|
|
161
|
+
objectType: input.objectType,
|
|
162
|
+
contentType: input.contentType,
|
|
163
|
+
recordId: input.recordId,
|
|
164
|
+
discriminatorValue: required?.single ?? undefined,
|
|
165
|
+
include: input.includeMarkdown ? { markdown: true } : undefined,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
const kind = classifyReadError(err);
|
|
170
|
+
if (kind === 'error')
|
|
171
|
+
return { state: 'error', data: null, error: err };
|
|
172
|
+
return { state: kind, data: null };
|
|
173
|
+
}
|
|
174
|
+
const body = contentData(page);
|
|
175
|
+
if (!body)
|
|
176
|
+
return { state: 'declared-empty', data: null };
|
|
177
|
+
if (isPlaceholderRecord(body))
|
|
178
|
+
return { state: 'placeholder', data: null };
|
|
179
|
+
return {
|
|
180
|
+
state: 'ready',
|
|
181
|
+
data: {
|
|
182
|
+
recordId: input.recordId,
|
|
183
|
+
data: body,
|
|
184
|
+
markdown: input.includeMarkdown ? documentMarkdown(page) : null,
|
|
185
|
+
scopeReason: readScopeReason(page),
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* One record. Names the discriminator instance when the pack marks it required.
|
|
191
|
+
* A miss, an undeclared content type, or a placeholder land is null.
|
|
192
|
+
* Anything else is thrown. Use {@link readContentResult} to tell those apart.
|
|
193
|
+
*/
|
|
194
|
+
export async function readContent(data, catalog, input) {
|
|
195
|
+
const result = await readContentResult(data, catalog, input);
|
|
196
|
+
if (result.state === 'error')
|
|
197
|
+
throw result.error;
|
|
198
|
+
return result.data;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Every sibling of one content type on one record.
|
|
202
|
+
* `getContent` answers 404 when several records share the id, so this lists with a filter instead.
|
|
203
|
+
*/
|
|
204
|
+
export async function listRecordContent(data, catalog, input) {
|
|
205
|
+
if (!input.recordId)
|
|
206
|
+
return [];
|
|
207
|
+
const filter = [{ field: 'recordId', op: 'eq', value: input.recordId }];
|
|
208
|
+
if (input.discriminator) {
|
|
209
|
+
filter.push({ field: `data.${input.discriminator.field}`, op: 'eq', value: input.discriminator.value });
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
const required = await requiredDiscriminator(catalog, input.objectType, input.contentType);
|
|
213
|
+
if (required)
|
|
214
|
+
filter.push({ field: required.path, op: 'exists', value: true });
|
|
215
|
+
}
|
|
216
|
+
const rows = await listContent(data, {
|
|
217
|
+
objectType: input.objectType,
|
|
218
|
+
contentType: input.contentType,
|
|
219
|
+
filter,
|
|
220
|
+
includeMarkdown: input.includeMarkdown,
|
|
221
|
+
maxPages: 1,
|
|
222
|
+
pageSize: 20,
|
|
223
|
+
});
|
|
224
|
+
if (!input.discriminator)
|
|
225
|
+
return rows;
|
|
226
|
+
const { field, value } = input.discriminator;
|
|
227
|
+
return rows.filter((row) => String(row.data[field] ?? '') === value);
|
|
228
|
+
}
|
|
229
|
+
const names = new Map();
|
|
230
|
+
/**
|
|
231
|
+
* `data.displayName` on the inventory row for this subject.
|
|
232
|
+
* One `listContent` of `inventory` filtered by record id. Null when the row has no name.
|
|
233
|
+
*/
|
|
234
|
+
export function inventoryDisplayName(client, objectType, recordId) {
|
|
235
|
+
const key = `${objectType}\u0000${recordId}`;
|
|
236
|
+
const hit = names.get(key);
|
|
237
|
+
if (hit)
|
|
238
|
+
return hit;
|
|
239
|
+
const pending = listContent(client, {
|
|
240
|
+
objectType,
|
|
241
|
+
contentType: 'inventory',
|
|
242
|
+
filter: [{ field: 'recordId', op: 'eq', value: recordId }],
|
|
243
|
+
maxPages: 1,
|
|
244
|
+
pageSize: 2,
|
|
245
|
+
})
|
|
246
|
+
.then((rows) => text(rows.find((row) => row.recordId === recordId)?.data.displayName))
|
|
247
|
+
.catch(() => null);
|
|
248
|
+
names.set(key, pending);
|
|
249
|
+
return pending;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/estate/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content types each side owns, in the order those contracts list them.
|
|
3
|
+
* Synapix is the lander collections that have stored rows, then the registered
|
|
4
|
+
* collections with no rows, then the source types memorix-skills reads and does not write.
|
|
5
|
+
* memorix-skills is neo-networks-v2 `contracts/registry.json`. inventory is Synapix;
|
|
6
|
+
* that pack reads it and does not write it.
|
|
7
|
+
*/
|
|
8
|
+
export type DataSide = 'synapix' | 'skills';
|
|
9
|
+
export type SkillsContent = {
|
|
10
|
+
id: string;
|
|
11
|
+
discriminators: string[];
|
|
12
|
+
/** Named in the registry as a declared gap, not a published instance. */
|
|
13
|
+
gap: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function synapixContentTypes(objectType: string): string[];
|
|
16
|
+
export declare function skillsContentTypes(objectType: string): SkillsContent[];
|
|
17
|
+
/** Every ai-agents content type, one pair per object type that declares it. */
|
|
18
|
+
export declare function skillsRecordTargets(): {
|
|
19
|
+
objectType: string;
|
|
20
|
+
contentType: string;
|
|
21
|
+
}[];
|
|
22
|
+
/** Object types that declare this ai-agents content type, with the discriminator values it may carry. */
|
|
23
|
+
export declare function declaringObjectTypes(contentType: string): {
|
|
24
|
+
objectType: string;
|
|
25
|
+
discriminators: string[];
|
|
26
|
+
}[];
|
|
27
|
+
/** Names the lander report lists that neither the Synapix tables nor the skills writes include. */
|
|
28
|
+
export declare function otherContractTypes(objectType: string): string[];
|
|
29
|
+
export declare function skillsContract(objectType: string, contentType: string): SkillsContent | null;
|
|
30
|
+
/** Synapix and skills are disjoint. Anything else is registered on the catalog but not in either contract. */
|
|
31
|
+
export declare function ownerOf(objectType: string, contentType: string): DataSide | null;
|
|
32
|
+
/**
|
|
33
|
+
* The triage instance a single-row read must name.
|
|
34
|
+
* `getContent` without `data.decisionType` answers 404, so a row read asks for the instance by name.
|
|
35
|
+
* Finding rows are `finding` / `triage` with `finding-triage`.
|
|
36
|
+
* Asset rows are `endpoint-asset` / `triage` with `asset-triage`.
|
|
37
|
+
* Zone rows are `network-zone` / `triage` with `zone-triage`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function triageInstance(objectType: string): 'finding-triage' | 'asset-triage' | 'zone-triage' | null;
|
|
40
|
+
/** One list the analysis pages render: a content type across every object type that declares it. */
|
|
41
|
+
export type ContentListSpec = {
|
|
42
|
+
contentType: string;
|
|
43
|
+
/** Object types whose contract declares this content type, in contract order. */
|
|
44
|
+
objectTypes: string[];
|
|
45
|
+
/** `data[acceptField]` must be one of these for the row to belong to the list. */
|
|
46
|
+
acceptField: string;
|
|
47
|
+
acceptValues: string[];
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Predicted attacks. List `predicted-attack` on each object type here, with markdown,
|
|
51
|
+
* and keep a row only when `data.predictionType` is one of `acceptValues`
|
|
52
|
+
* (`finding-attack`, `asset-attack`, `alert-attack`, `device-attack`, `zone-attack`).
|
|
53
|
+
*/
|
|
54
|
+
export declare const PREDICTED_ATTACK_LIST: ContentListSpec;
|
|
55
|
+
/**
|
|
56
|
+
* Mitigation plans. List `mitigation` on each object type here, with markdown,
|
|
57
|
+
* and keep a row only when `isMitigationPlan` is true.
|
|
58
|
+
*/
|
|
59
|
+
export declare const MITIGATION_LIST: ContentListSpec;
|
|
60
|
+
/** `mitigationType` is `response-plan` and the plan names the response-plan schema. */
|
|
61
|
+
export declare function isMitigationPlan(data: Record<string, unknown>): boolean;
|
|
62
|
+
/** `data.predictionType` is one of the predicted-attack discriminators. */
|
|
63
|
+
export declare function isPredictedAttack(data: Record<string, unknown>): boolean;
|
|
64
|
+
/** One content type this consumer reads. The pack lint compares this list with installed metadata. */
|
|
65
|
+
export type ConsumerRead = {
|
|
66
|
+
objectType: string;
|
|
67
|
+
contentType: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Content types the pages read, one pair per object type.
|
|
71
|
+
* This is the skills contract, the story tab, the finding verdict, and the census.
|
|
72
|
+
* It is not the lander catalog: a collection that exists on one subject and not another
|
|
73
|
+
* is not a missing read.
|
|
74
|
+
*/
|
|
75
|
+
export declare const CONSUMER_MANIFEST: readonly ConsumerRead[];
|
|
76
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/estate/contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,yEAAyE;IACzE,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AA2KF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAEtE;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,IAAI;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,CAInF;AAED,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,CAM5G;AAED,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/D;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAE5F;AAED,8GAA8G;AAC9G,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAIhF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GACjB,gBAAgB,GAAG,cAAc,GAAG,aAAa,GAAG,IAAI,CAM1D;AAED,oGAAoG;AACpG,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,eAAgE,CAAC;AAErG;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAA0D,CAAC;AAEzF,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAOvE;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAExE;AAED,sGAAsG;AACtG,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAwBF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,YAAY,EAKnD,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content types each side owns, in the order those contracts list them.
|
|
3
|
+
* Synapix is the lander collections that have stored rows, then the registered
|
|
4
|
+
* collections with no rows, then the source types memorix-skills reads and does not write.
|
|
5
|
+
* memorix-skills is neo-networks-v2 `contracts/registry.json`. inventory is Synapix;
|
|
6
|
+
* that pack reads it and does not write it.
|
|
7
|
+
*/
|
|
8
|
+
const LANDER_SUBJECTS = new Set([
|
|
9
|
+
'alert',
|
|
10
|
+
'endpoint-asset',
|
|
11
|
+
'endpoint-subject',
|
|
12
|
+
'finding',
|
|
13
|
+
'firewall-address',
|
|
14
|
+
'firewall-interface',
|
|
15
|
+
'firewall-policy',
|
|
16
|
+
'firewall-route',
|
|
17
|
+
'firewall-service',
|
|
18
|
+
'network-device',
|
|
19
|
+
'network-zone',
|
|
20
|
+
'unresolved-subject',
|
|
21
|
+
]);
|
|
22
|
+
/** Stored lander collections, then registered-but-empty, then skills read sources. */
|
|
23
|
+
const SYNAPIX_SUBJECT = [
|
|
24
|
+
'inventory',
|
|
25
|
+
'security-context',
|
|
26
|
+
'classification',
|
|
27
|
+
'reachability-claims',
|
|
28
|
+
'exploitability-assessments',
|
|
29
|
+
'attackability-assessments',
|
|
30
|
+
'evidence-lineage',
|
|
31
|
+
'agent-context',
|
|
32
|
+
'pre-ai-context',
|
|
33
|
+
'field-completeness',
|
|
34
|
+
'open-vuln-assessment',
|
|
35
|
+
'source-occurrence',
|
|
36
|
+
'reachability-paths',
|
|
37
|
+
'live-context',
|
|
38
|
+
'processing-status',
|
|
39
|
+
'event-evidence',
|
|
40
|
+
'object-reachability-paths',
|
|
41
|
+
];
|
|
42
|
+
const SYNAPIX_SECURITY_MAP = ['bootstrap'];
|
|
43
|
+
/** Registered on finding, named in the lander report, not written by neo-networks-v2. */
|
|
44
|
+
const FINDING_REGISTERED = [
|
|
45
|
+
'analysis-refined',
|
|
46
|
+
'analysis-closure',
|
|
47
|
+
'analysis-enriched',
|
|
48
|
+
'analysis-repair',
|
|
49
|
+
'triage-reassessment',
|
|
50
|
+
];
|
|
51
|
+
const SKILLS = {
|
|
52
|
+
finding: [
|
|
53
|
+
{
|
|
54
|
+
id: 'analysis',
|
|
55
|
+
discriminators: [
|
|
56
|
+
'entity-context',
|
|
57
|
+
'assessment-admission',
|
|
58
|
+
'global-context',
|
|
59
|
+
'applicability',
|
|
60
|
+
'mechanism-sources',
|
|
61
|
+
'exploit-mechanism',
|
|
62
|
+
'attackability',
|
|
63
|
+
'vulnerability',
|
|
64
|
+
'path-gap',
|
|
65
|
+
'path-mechanism',
|
|
66
|
+
'detection',
|
|
67
|
+
'attack-hypothesis',
|
|
68
|
+
'claim-review',
|
|
69
|
+
'claim-review-decision',
|
|
70
|
+
'evidence-task',
|
|
71
|
+
],
|
|
72
|
+
gap: false,
|
|
73
|
+
},
|
|
74
|
+
{ id: 'overview', discriminators: ['entity-overview'], gap: false },
|
|
75
|
+
{ id: 'predicted-attack', discriminators: ['finding-attack'], gap: false },
|
|
76
|
+
{ id: 'triage-model', discriminators: ['finding-triage'], gap: false },
|
|
77
|
+
{ id: 'triage', discriminators: ['finding-triage'], gap: false },
|
|
78
|
+
{ id: 'mitigation', discriminators: ['response-plan'], gap: false },
|
|
79
|
+
],
|
|
80
|
+
'endpoint-asset': [
|
|
81
|
+
{
|
|
82
|
+
id: 'analysis',
|
|
83
|
+
discriminators: [
|
|
84
|
+
'entity-context',
|
|
85
|
+
'entity-relations',
|
|
86
|
+
'vulnerable-asset',
|
|
87
|
+
'path-gap',
|
|
88
|
+
'asset-exposure',
|
|
89
|
+
'attack-hypothesis',
|
|
90
|
+
],
|
|
91
|
+
gap: false,
|
|
92
|
+
},
|
|
93
|
+
{ id: 'overview', discriminators: ['entity-overview'], gap: false },
|
|
94
|
+
{ id: 'predicted-attack', discriminators: ['asset-attack'], gap: false },
|
|
95
|
+
{ id: 'triage', discriminators: ['asset-triage'], gap: false },
|
|
96
|
+
{ id: 'mitigation', discriminators: ['response-plan'], gap: false },
|
|
97
|
+
],
|
|
98
|
+
alert: [
|
|
99
|
+
{
|
|
100
|
+
id: 'analysis',
|
|
101
|
+
discriminators: [
|
|
102
|
+
'entity-context',
|
|
103
|
+
'path-gap',
|
|
104
|
+
'alert-pressure',
|
|
105
|
+
'alert-response',
|
|
106
|
+
'alert-correlation',
|
|
107
|
+
'attack-hypothesis',
|
|
108
|
+
],
|
|
109
|
+
gap: false,
|
|
110
|
+
},
|
|
111
|
+
{ id: 'observation', discriminators: [], gap: false },
|
|
112
|
+
{ id: 'predicted-attack', discriminators: ['alert-attack'], gap: false },
|
|
113
|
+
{ id: 'triage', discriminators: ['alert-triage'], gap: false },
|
|
114
|
+
{ id: 'mitigation', discriminators: ['response-plan'], gap: false },
|
|
115
|
+
],
|
|
116
|
+
'unresolved-subject': [
|
|
117
|
+
{
|
|
118
|
+
id: 'analysis',
|
|
119
|
+
discriminators: ['entity-context', 'identity-link', 'path-gap'],
|
|
120
|
+
gap: false,
|
|
121
|
+
},
|
|
122
|
+
{ id: 'triage', discriminators: ['unresolved-triage'], gap: true },
|
|
123
|
+
],
|
|
124
|
+
'network-device': [
|
|
125
|
+
{
|
|
126
|
+
id: 'analysis',
|
|
127
|
+
discriminators: ['entity-context', 'path-gap', 'device-reachability', 'attack-hypothesis'],
|
|
128
|
+
gap: false,
|
|
129
|
+
},
|
|
130
|
+
{ id: 'predicted-attack', discriminators: ['device-attack'], gap: true },
|
|
131
|
+
{ id: 'triage', discriminators: ['device-triage'], gap: true },
|
|
132
|
+
],
|
|
133
|
+
'network-zone': [
|
|
134
|
+
{
|
|
135
|
+
id: 'analysis',
|
|
136
|
+
discriminators: ['entity-context', 'entity-relations', 'path-gap', 'zone-exposure', 'attack-hypothesis'],
|
|
137
|
+
gap: false,
|
|
138
|
+
},
|
|
139
|
+
{ id: 'predicted-attack', discriminators: ['zone-attack'], gap: false },
|
|
140
|
+
{ id: 'triage', discriminators: ['zone-triage'], gap: false },
|
|
141
|
+
{ id: 'mitigation', discriminators: ['response-plan'], gap: false },
|
|
142
|
+
],
|
|
143
|
+
'security-map': [
|
|
144
|
+
{
|
|
145
|
+
id: 'process-manifest',
|
|
146
|
+
discriminators: [
|
|
147
|
+
'scope-finding',
|
|
148
|
+
'scope-endpoint-asset',
|
|
149
|
+
'scope-alert',
|
|
150
|
+
'scope-unresolved-subject',
|
|
151
|
+
'scope-network-device',
|
|
152
|
+
'scope-network-zone',
|
|
153
|
+
'nx-c-p2',
|
|
154
|
+
'nx-c-p3',
|
|
155
|
+
'nx-c-p4',
|
|
156
|
+
'nx-c-p5',
|
|
157
|
+
'nx-c-p6-vuln',
|
|
158
|
+
'nx-c-p6-alert',
|
|
159
|
+
'nx-c-p6-mitigation',
|
|
160
|
+
'nx-c-publish',
|
|
161
|
+
],
|
|
162
|
+
gap: false,
|
|
163
|
+
},
|
|
164
|
+
{ id: 'analysis', discriminators: ['occurrence-readiness'], gap: false },
|
|
165
|
+
{ id: 'estate-analytics', discriminators: ['publication'], gap: false },
|
|
166
|
+
],
|
|
167
|
+
};
|
|
168
|
+
function typeOf(objectType) {
|
|
169
|
+
return String(objectType ?? '').trim().toLowerCase();
|
|
170
|
+
}
|
|
171
|
+
export function synapixContentTypes(objectType) {
|
|
172
|
+
const type = typeOf(objectType);
|
|
173
|
+
if (type === 'security-map')
|
|
174
|
+
return SYNAPIX_SECURITY_MAP;
|
|
175
|
+
if (!LANDER_SUBJECTS.has(type))
|
|
176
|
+
return [];
|
|
177
|
+
return SYNAPIX_SUBJECT;
|
|
178
|
+
}
|
|
179
|
+
export function skillsContentTypes(objectType) {
|
|
180
|
+
return SKILLS[typeOf(objectType)] ?? [];
|
|
181
|
+
}
|
|
182
|
+
/** Every ai-agents content type, one pair per object type that declares it. */
|
|
183
|
+
export function skillsRecordTargets() {
|
|
184
|
+
return Object.entries(SKILLS).flatMap(([objectType, types]) => types.map((item) => ({ objectType, contentType: item.id })));
|
|
185
|
+
}
|
|
186
|
+
/** Object types that declare this ai-agents content type, with the discriminator values it may carry. */
|
|
187
|
+
export function declaringObjectTypes(contentType) {
|
|
188
|
+
return Object.entries(SKILLS).flatMap(([objectType, types]) => types
|
|
189
|
+
.filter((item) => item.id === contentType)
|
|
190
|
+
.map((item) => ({ objectType, discriminators: item.discriminators })));
|
|
191
|
+
}
|
|
192
|
+
/** Names the lander report lists that neither the Synapix tables nor the skills writes include. */
|
|
193
|
+
export function otherContractTypes(objectType) {
|
|
194
|
+
if (typeOf(objectType) === 'finding')
|
|
195
|
+
return FINDING_REGISTERED;
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
export function skillsContract(objectType, contentType) {
|
|
199
|
+
return skillsContentTypes(objectType).find((item) => item.id === contentType) ?? null;
|
|
200
|
+
}
|
|
201
|
+
/** Synapix and skills are disjoint. Anything else is registered on the catalog but not in either contract. */
|
|
202
|
+
export function ownerOf(objectType, contentType) {
|
|
203
|
+
if (skillsContentTypes(objectType).some((item) => item.id === contentType))
|
|
204
|
+
return 'skills';
|
|
205
|
+
if (synapixContentTypes(objectType).includes(contentType))
|
|
206
|
+
return 'synapix';
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The triage instance a single-row read must name.
|
|
211
|
+
* `getContent` without `data.decisionType` answers 404, so a row read asks for the instance by name.
|
|
212
|
+
* Finding rows are `finding` / `triage` with `finding-triage`.
|
|
213
|
+
* Asset rows are `endpoint-asset` / `triage` with `asset-triage`.
|
|
214
|
+
* Zone rows are `network-zone` / `triage` with `zone-triage`.
|
|
215
|
+
*/
|
|
216
|
+
export function triageInstance(objectType) {
|
|
217
|
+
const type = objectType.trim().toLowerCase();
|
|
218
|
+
if (type === 'finding')
|
|
219
|
+
return 'finding-triage';
|
|
220
|
+
if (type === 'endpoint-asset')
|
|
221
|
+
return 'asset-triage';
|
|
222
|
+
if (type === 'network-zone')
|
|
223
|
+
return 'zone-triage';
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
function listSpec(contentType, acceptField) {
|
|
227
|
+
const sources = declaringObjectTypes(contentType);
|
|
228
|
+
return {
|
|
229
|
+
contentType,
|
|
230
|
+
objectTypes: sources.map((source) => source.objectType),
|
|
231
|
+
acceptField,
|
|
232
|
+
acceptValues: [...new Set(sources.flatMap((source) => source.discriminators))],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Predicted attacks. List `predicted-attack` on each object type here, with markdown,
|
|
237
|
+
* and keep a row only when `data.predictionType` is one of `acceptValues`
|
|
238
|
+
* (`finding-attack`, `asset-attack`, `alert-attack`, `device-attack`, `zone-attack`).
|
|
239
|
+
*/
|
|
240
|
+
export const PREDICTED_ATTACK_LIST = listSpec('predicted-attack', 'predictionType');
|
|
241
|
+
/**
|
|
242
|
+
* Mitigation plans. List `mitigation` on each object type here, with markdown,
|
|
243
|
+
* and keep a row only when `isMitigationPlan` is true.
|
|
244
|
+
*/
|
|
245
|
+
export const MITIGATION_LIST = listSpec('mitigation', 'mitigationType');
|
|
246
|
+
/** `mitigationType` is `response-plan` and the plan names the response-plan schema. */
|
|
247
|
+
export function isMitigationPlan(data) {
|
|
248
|
+
const plan = data.plan;
|
|
249
|
+
const schema = plan && typeof plan === 'object' && !Array.isArray(plan)
|
|
250
|
+
? plan.schemaVersion
|
|
251
|
+
: null;
|
|
252
|
+
return data.mitigationType === 'response-plan' && schema === 'response-plan/v1';
|
|
253
|
+
}
|
|
254
|
+
/** `data.predictionType` is one of the predicted-attack discriminators. */
|
|
255
|
+
export function isPredictedAttack(data) {
|
|
256
|
+
return PREDICTED_ATTACK_LIST.acceptValues.includes(String(data.predictionType ?? ''));
|
|
257
|
+
}
|
|
258
|
+
/** Object types whose Story tab reads content type `story`. */
|
|
259
|
+
const STORY_OBJECTS = [
|
|
260
|
+
'endpoint-asset',
|
|
261
|
+
'finding',
|
|
262
|
+
'alert',
|
|
263
|
+
'network-device',
|
|
264
|
+
'network-zone',
|
|
265
|
+
'unresolved-subject',
|
|
266
|
+
'vulnerability',
|
|
267
|
+
'security-map',
|
|
268
|
+
];
|
|
269
|
+
function uniqueReads(rows) {
|
|
270
|
+
const seen = new Set();
|
|
271
|
+
return rows.filter((row) => {
|
|
272
|
+
const key = `${row.objectType}/${row.contentType}`;
|
|
273
|
+
if (seen.has(key))
|
|
274
|
+
return false;
|
|
275
|
+
seen.add(key);
|
|
276
|
+
return true;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Content types the pages read, one pair per object type.
|
|
281
|
+
* This is the skills contract, the story tab, the finding verdict, and the census.
|
|
282
|
+
* It is not the lander catalog: a collection that exists on one subject and not another
|
|
283
|
+
* is not a missing read.
|
|
284
|
+
*/
|
|
285
|
+
export const CONSUMER_MANIFEST = uniqueReads([
|
|
286
|
+
...skillsRecordTargets(),
|
|
287
|
+
...STORY_OBJECTS.map((objectType) => ({ objectType, contentType: 'story' })),
|
|
288
|
+
{ objectType: 'finding', contentType: 'verdict-reason' },
|
|
289
|
+
{ objectType: 'security-map', contentType: 'tier0-analytics' },
|
|
290
|
+
]);
|
|
291
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/estate/contract.ts"],"names":[],"mappings":"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"}
|