@scoutflo/topology-contracts 0.8.0 → 0.9.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 (41) hide show
  1. package/README.md +1 -0
  2. package/dist/src/correlation/connectionContractV1.d.ts +100 -48
  3. package/dist/src/correlation/connectionContractV1.js +75 -3
  4. package/dist/src/correlation/connectionContractV1.js.map +1 -1
  5. package/dist/src/correlation/contracts/authoring.d.ts +1 -1
  6. package/dist/src/correlation/contracts/authoring.js +16 -5
  7. package/dist/src/correlation/contracts/authoring.js.map +1 -1
  8. package/dist/src/correlation/contracts/families/index.d.ts +39 -31
  9. package/dist/src/correlation/contracts/families/integrations/index.d.ts +39 -31
  10. package/dist/src/correlation/contracts/families/integrations/index.js +39 -36
  11. package/dist/src/correlation/contracts/families/integrations/index.js.map +1 -1
  12. package/dist/src/correlation/contracts/registry.d.ts +39 -31
  13. package/dist/src/index.d.ts +2 -0
  14. package/dist/src/index.js +2 -0
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/investigation/context.d.ts +22185 -798
  17. package/dist/src/investigation/context.js +221 -58
  18. package/dist/src/investigation/context.js.map +1 -1
  19. package/dist/src/product-identity.d.ts +30 -0
  20. package/dist/src/product-identity.js +128 -0
  21. package/dist/src/product-identity.js.map +1 -0
  22. package/dist/src/provenance/index.d.ts +1 -0
  23. package/dist/src/provenance/index.js +18 -0
  24. package/dist/src/provenance/index.js.map +1 -0
  25. package/dist/src/provenance/runtimeContainer.d.ts +431 -0
  26. package/dist/src/provenance/runtimeContainer.js +139 -0
  27. package/dist/src/provenance/runtimeContainer.js.map +1 -0
  28. package/dist/src/schemas/index.d.ts +2 -1
  29. package/dist/src/schemas/index.js +12 -4
  30. package/dist/src/schemas/index.js.map +1 -1
  31. package/dist/test/contracts.test.js +59 -43
  32. package/dist/test/contracts.test.js.map +1 -1
  33. package/dist/test/investigation-context.test.js +184 -0
  34. package/dist/test/investigation-context.test.js.map +1 -1
  35. package/dist/test/product-identity.test.d.ts +1 -0
  36. package/dist/test/product-identity.test.js +103 -0
  37. package/dist/test/product-identity.test.js.map +1 -0
  38. package/dist/test/runtime-provenance.test.d.ts +1 -0
  39. package/dist/test/runtime-provenance.test.js +134 -0
  40. package/dist/test/runtime-provenance.test.js.map +1 -0
  41. package/package.json +3 -2
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = __importDefault(require("node:test"));
8
+ const product_identity_1 = require("../src/product-identity");
9
+ const scope = {
10
+ account_key: 'acme.example',
11
+ integration_id: 'integration-42',
12
+ };
13
+ (0, node_test_1.default)('normalizes Jira and JSM project keys while preserving raw evidence and scope', () => {
14
+ for (const provider of ['jira', 'jsm']) {
15
+ strict_1.default.deepEqual((0, product_identity_1.normalizeProviderProductKey)({
16
+ provider,
17
+ raw_value: ' https://acme.atlassian.net/browse/ PAY-123?focusedCommentId=9 ',
18
+ ...scope,
19
+ }), {
20
+ version: 'provider-product-key.v1',
21
+ provider,
22
+ raw_value: ' https://acme.atlassian.net/browse/ PAY-123?focusedCommentId=9 ',
23
+ canonical_key: 'pay',
24
+ account_key: 'acme.example',
25
+ integration_id: 'integration-42',
26
+ });
27
+ }
28
+ });
29
+ (0, node_test_1.default)('normalizes Confluence URL-derived Unicode space keys deterministically', () => {
30
+ strict_1.default.equal((0, product_identity_1.normalizeProviderProductKey)({
31
+ provider: 'confluence',
32
+ raw_value: 'https://acme.atlassian.net/wiki/spaces/Platform%20Caf%C3%A9/pages/123',
33
+ ...scope,
34
+ })?.canonical_key, 'platform-café');
35
+ });
36
+ (0, node_test_1.default)('normalizes Sentry project slugs without collapsing project scope', () => {
37
+ strict_1.default.deepEqual((0, product_identity_1.normalizeProviderProductKey)({
38
+ provider: 'sentry',
39
+ raw_value: ' HTTPS://sentry.io/organizations/acme/issues/?project=Payments_API ',
40
+ project_id: '4500123',
41
+ ...scope,
42
+ }), {
43
+ version: 'provider-product-key.v1',
44
+ provider: 'sentry',
45
+ raw_value: ' HTTPS://sentry.io/organizations/acme/issues/?project=Payments_API ',
46
+ canonical_key: 'payments-api',
47
+ account_key: 'acme.example',
48
+ integration_id: 'integration-42',
49
+ project_id: '4500123',
50
+ });
51
+ });
52
+ (0, node_test_1.default)('rejects unsupported providers and unbounded or empty keys', () => {
53
+ strict_1.default.equal((0, product_identity_1.normalizeProviderProductKey)({ provider: 'github', raw_value: 'repo', ...scope }), undefined);
54
+ strict_1.default.equal((0, product_identity_1.normalizeProviderProductKey)({ provider: 'sentry', raw_value: ' '.repeat(3), ...scope }), undefined);
55
+ strict_1.default.equal((0, product_identity_1.normalizeProviderProductKey)({ provider: 'sentry', raw_value: 'x'.repeat(513), ...scope }), undefined);
56
+ });
57
+ (0, node_test_1.default)('keeps identical canonical keys distinct through required provider scope', () => {
58
+ const first = (0, product_identity_1.normalizeProviderProductKey)({
59
+ provider: 'sentry',
60
+ raw_value: 'Payments API',
61
+ account_key: 'account-a',
62
+ integration_id: 'integration-a',
63
+ project_id: '1',
64
+ });
65
+ const second = (0, product_identity_1.normalizeProviderProductKey)({
66
+ provider: 'sentry',
67
+ raw_value: 'payments-api',
68
+ account_key: 'account-b',
69
+ integration_id: 'integration-b',
70
+ project_id: '2',
71
+ });
72
+ strict_1.default.equal(first?.canonical_key, second?.canonical_key);
73
+ strict_1.default.notDeepEqual(first, second);
74
+ });
75
+ (0, node_test_1.default)('parses bounded semantic versions and named releases into structured claims', () => {
76
+ strict_1.default.deepEqual((0, product_identity_1.parseSentryReleaseClaim)('payments-api@1.24.3+build.7'), {
77
+ version: 'sentry-release-claim.v1',
78
+ raw_value: 'payments-api@1.24.3+build.7',
79
+ release_name: 'payments-api',
80
+ semantic_version: '1.24.3+build.7',
81
+ immutable_revision: false,
82
+ });
83
+ strict_1.default.deepEqual((0, product_identity_1.parseSentryReleaseClaim)('v2.0.1-rc.2'), {
84
+ version: 'sentry-release-claim.v1',
85
+ raw_value: 'v2.0.1-rc.2',
86
+ semantic_version: '2.0.1-rc.2',
87
+ immutable_revision: false,
88
+ });
89
+ });
90
+ (0, node_test_1.default)('accepts only full commit SHAs as immutable Sentry release evidence', () => {
91
+ const sha = '0123456789abcdef0123456789abcdef01234567';
92
+ strict_1.default.deepEqual((0, product_identity_1.parseSentryReleaseClaim)(sha), {
93
+ version: 'sentry-release-claim.v1',
94
+ raw_value: sha,
95
+ revision: sha,
96
+ immutable_revision: true,
97
+ });
98
+ strict_1.default.equal((0, product_identity_1.parseSentryReleaseClaim)('main')?.immutable_revision, false);
99
+ strict_1.default.equal((0, product_identity_1.parseSentryReleaseClaim)('v1.2')?.immutable_revision, false);
100
+ strict_1.default.equal((0, product_identity_1.parseSentryReleaseClaim)('0123456789ab')?.immutable_revision, false);
101
+ strict_1.default.equal((0, product_identity_1.parseSentryReleaseClaim)('x'.repeat(257)), undefined);
102
+ });
103
+ //# sourceMappingURL=product-identity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-identity.test.js","sourceRoot":"","sources":["../../test/product-identity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = __importDefault(require("node:test"));
8
+ const src_1 = require("../src");
9
+ (0, node_test_1.default)('accepts only credential-free HTTPS source repositories with a path', () => {
10
+ strict_1.default.equal(src_1.safeSourceRepositorySchema.safeParse('https://github.com/example/checkout').success, true);
11
+ for (const repository of [
12
+ 'github.com/example/checkout',
13
+ 'git@github.com:example/checkout.git',
14
+ 'http://github.com/example/checkout',
15
+ 'https://user:token@github.com/example/checkout',
16
+ 'https://github.com/example/checkout?ref=main',
17
+ 'https://github.com/example/checkout#readme',
18
+ 'https://github.com/',
19
+ ]) {
20
+ strict_1.default.equal(src_1.safeSourceRepositorySchema.safeParse(repository).success, false, repository);
21
+ }
22
+ });
23
+ (0, node_test_1.default)('parses immutable observed-vs-claimed provenance for Gateway consumption', () => {
24
+ const parsed = src_1.runtimeWorkloadProvenanceSchema.parse({
25
+ version: src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION,
26
+ containers: [{
27
+ name: 'checkout',
28
+ kind: 'regular',
29
+ scope: { namespace: 'prod', workload_kind: 'Deployment', workload_name: 'checkout' },
30
+ requested_image: 'registry.example/checkout:v2',
31
+ observed_image: 'registry.example/checkout@sha256:abc',
32
+ observed_image_id: 'containerd://sha256:abc',
33
+ digest: `sha256:${'a'.repeat(64)}`,
34
+ runtime_identity_status: 'verified',
35
+ consistency_status: 'consistent',
36
+ claimed_source: {
37
+ repository: 'https://github.com/example/checkout',
38
+ commit_sha: '0123456789abcdef0123456789abcdef01234567',
39
+ scope: 'pod_metadata',
40
+ status: 'unverified',
41
+ reason: 'Pod metadata is a claim and is not runtime verification.',
42
+ },
43
+ }],
44
+ truncated: false,
45
+ });
46
+ strict_1.default.equal(parsed.containers[0]?.digest, `sha256:${'a'.repeat(64)}`);
47
+ strict_1.default.equal(parsed.containers[0]?.claimed_source?.status, 'unverified');
48
+ });
49
+ (0, node_test_1.default)('allows duplicate names across kinds but enforces deterministic ordering', () => {
50
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
51
+ version: src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION,
52
+ containers: [
53
+ { name: 'agent', kind: 'regular', runtime_identity_status: 'unavailable', runtime_identity_reason: 'not observed', consistency_status: 'unknown', consistency_reason: 'not compared' },
54
+ { name: 'agent', kind: 'init', runtime_identity_status: 'unavailable', runtime_identity_reason: 'not observed', consistency_status: 'unknown', consistency_reason: 'not compared' },
55
+ ],
56
+ truncated: false,
57
+ }).success, true);
58
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
59
+ version: src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION,
60
+ containers: [
61
+ { name: 'agent', kind: 'init', runtime_identity_status: 'unavailable', runtime_identity_reason: 'not observed', consistency_status: 'unknown', consistency_reason: 'not compared' },
62
+ { name: 'agent', kind: 'regular', runtime_identity_status: 'unavailable', runtime_identity_reason: 'not observed', consistency_status: 'unknown', consistency_reason: 'not compared' },
63
+ ],
64
+ truncated: false,
65
+ }).success, false);
66
+ });
67
+ (0, node_test_1.default)('rejects oversized containers and untruthful truncation metadata', () => {
68
+ const container = {
69
+ name: 'agent', kind: 'regular',
70
+ runtime_identity_status: 'unavailable', runtime_identity_reason: 'not observed',
71
+ consistency_status: 'unknown', consistency_reason: 'not compared',
72
+ };
73
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
74
+ version: src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION,
75
+ containers: Array.from({ length: 129 }, (_, index) => ({ ...container, name: `agent-${index}` })),
76
+ truncated: true,
77
+ reason: 'container_limit_exceeded',
78
+ containers_omitted: 1,
79
+ }).success, false);
80
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
81
+ containers: [],
82
+ truncated: true,
83
+ reason: 'container_limit_exceeded',
84
+ }).success, true);
85
+ const compatibleRawK8sOutput = src_1.runtimeWorkloadProvenanceSchema.parse({
86
+ containers: [],
87
+ truncated: true,
88
+ reason: 'container_limit_exceeded',
89
+ });
90
+ strict_1.default.equal(compatibleRawK8sOutput.version, src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION);
91
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
92
+ version: src_1.RUNTIME_CONTAINER_PROVENANCE_VERSION,
93
+ containers: [{
94
+ ...container,
95
+ claimed_source: {
96
+ repository: 'https://github.com/example/checkout',
97
+ commit_sha: 'v2.1.0',
98
+ scope: 'pod_metadata',
99
+ status: 'unverified',
100
+ },
101
+ }],
102
+ truncated: false,
103
+ }).success, false);
104
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
105
+ containers: [{
106
+ ...container,
107
+ runtime_identity_status: 'verified',
108
+ digest: 'sha256:not-a-digest',
109
+ }],
110
+ truncated: false,
111
+ }).success, false);
112
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
113
+ containers: [{
114
+ ...container,
115
+ claimed_source: {
116
+ repository: 'https://github.com/example/checkout',
117
+ scope: 'pod_metadata',
118
+ status: 'unavailable',
119
+ reason: 'metadata unavailable',
120
+ },
121
+ }],
122
+ truncated: false,
123
+ }).success, false);
124
+ strict_1.default.equal(src_1.runtimeWorkloadProvenanceSchema.safeParse({
125
+ containers: [{
126
+ ...container,
127
+ runtime_identity_status: 'verified',
128
+ runtime_identity_reason: undefined,
129
+ digest: `sha256:${'A'.repeat(64)}`,
130
+ }],
131
+ truncated: false,
132
+ }).success, false);
133
+ });
134
+ //# sourceMappingURL=runtime-provenance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-provenance.test.js","sourceRoot":"","sources":["../../test/runtime-provenance.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scoutflo/topology-contracts",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Pure shared topology vocabulary and Zod schemas for Scoutflo topology workflows.",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -9,7 +9,8 @@
9
9
  ],
10
10
  "scripts": {
11
11
  "build": "tsc -p tsconfig.json",
12
- "test": "npm run build && node --test dist/test/*.test.js"
12
+ "test": "npm run build && node --test dist/test/*.test.js && node scripts/verify-packed-exports.cjs",
13
+ "prepack": "npm run build"
13
14
  },
14
15
  "keywords": [
15
16
  "scoutflo",