@iann29/rastro 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (124) hide show
  1. package/README.md +325 -63
  2. package/agent/integration.md +651 -0
  3. package/agent/manifest.json +183 -0
  4. package/agent/manifest.schema.json +405 -0
  5. package/dist/client/federation.d.ts +205 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +179 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +1600 -8
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +210 -2
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +9 -5
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +161 -1
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/_generated/server.d.ts +4 -0
  19. package/dist/component/_generated/server.d.ts.map +1 -1
  20. package/dist/component/_generated/server.js.map +1 -1
  21. package/dist/component/cardinality.d.ts +12 -0
  22. package/dist/component/cardinality.d.ts.map +1 -0
  23. package/dist/component/cardinality.js +94 -0
  24. package/dist/component/cardinality.js.map +1 -0
  25. package/dist/component/constants.d.ts +10 -0
  26. package/dist/component/constants.d.ts.map +1 -1
  27. package/dist/component/constants.js +10 -0
  28. package/dist/component/constants.js.map +1 -1
  29. package/dist/component/convex.config.d.ts +7 -2
  30. package/dist/component/convex.config.d.ts.map +1 -1
  31. package/dist/component/convex.config.js +9 -4
  32. package/dist/component/convex.config.js.map +1 -1
  33. package/dist/component/coverage.d.ts +18 -0
  34. package/dist/component/coverage.d.ts.map +1 -0
  35. package/dist/component/coverage.js +19 -0
  36. package/dist/component/coverage.js.map +1 -0
  37. package/dist/component/diagnostics.d.ts +9 -0
  38. package/dist/component/diagnostics.d.ts.map +1 -0
  39. package/dist/component/diagnostics.js +47 -0
  40. package/dist/component/diagnostics.js.map +1 -0
  41. package/dist/component/errors.d.ts +1 -1
  42. package/dist/component/errors.d.ts.map +1 -1
  43. package/dist/component/errors.js.map +1 -1
  44. package/dist/component/eventStore.d.ts +11 -9
  45. package/dist/component/eventStore.d.ts.map +1 -1
  46. package/dist/component/eventStore.js +55 -227
  47. package/dist/component/eventStore.js.map +1 -1
  48. package/dist/component/geo.d.ts +71 -0
  49. package/dist/component/geo.d.ts.map +1 -0
  50. package/dist/component/geo.js +610 -0
  51. package/dist/component/geo.js.map +1 -0
  52. package/dist/component/http.d.ts.map +1 -1
  53. package/dist/component/http.js +168 -17
  54. package/dist/component/http.js.map +1 -1
  55. package/dist/component/ingest.d.ts.map +1 -1
  56. package/dist/component/ingest.js +272 -32
  57. package/dist/component/ingest.js.map +1 -1
  58. package/dist/component/live.d.ts.map +1 -1
  59. package/dist/component/live.js +6 -3
  60. package/dist/component/live.js.map +1 -1
  61. package/dist/component/reports.d.ts +117 -8
  62. package/dist/component/reports.d.ts.map +1 -1
  63. package/dist/component/reports.js +641 -79
  64. package/dist/component/reports.js.map +1 -1
  65. package/dist/component/retention.d.ts +75 -1
  66. package/dist/component/retention.d.ts.map +1 -1
  67. package/dist/component/retention.js +517 -54
  68. package/dist/component/retention.js.map +1 -1
  69. package/dist/component/sanitize.d.ts +4 -1
  70. package/dist/component/sanitize.d.ts.map +1 -1
  71. package/dist/component/sanitize.js +9 -4
  72. package/dist/component/sanitize.js.map +1 -1
  73. package/dist/component/schema.d.ts +202 -53
  74. package/dist/component/schema.js +113 -16
  75. package/dist/component/schema.js.map +1 -1
  76. package/dist/component/sites.d.ts.map +1 -1
  77. package/dist/component/sites.js +5 -1
  78. package/dist/component/sites.js.map +1 -1
  79. package/dist/component/validators.d.ts +29 -51
  80. package/dist/component/validators.d.ts.map +1 -1
  81. package/dist/component/validators.js +11 -12
  82. package/dist/component/validators.js.map +1 -1
  83. package/dist/tracker/generated.d.ts +4 -4
  84. package/dist/tracker/generated.d.ts.map +1 -1
  85. package/dist/tracker/generated.js +4 -4
  86. package/dist/tracker/generated.js.map +1 -1
  87. package/dist/tracker/tracker.js +7 -6
  88. package/dist/tracker/tracker.js.map +1 -1
  89. package/dist/tracker.min.js +1 -1
  90. package/docs/benchmarks/2026-08-20-realistic.md +5 -5
  91. package/docs/benchmarks/2026-08-21-formal-certification.md +333 -0
  92. package/docs/federation-setup.md +395 -0
  93. package/docs/federation.md +258 -0
  94. package/docs/upgrading.md +130 -0
  95. package/llms.txt +65 -0
  96. package/package.json +29 -7
  97. package/scripts/benchmark-ingest.mjs +81 -32
  98. package/scripts/generate-federation-keys.mjs +20 -0
  99. package/src/component/_generated/api.ts +9 -5
  100. package/src/component/_generated/component.ts +224 -1
  101. package/src/component/_generated/server.ts +4 -0
  102. package/src/component/cardinality.ts +116 -0
  103. package/src/component/constants.ts +10 -0
  104. package/src/component/convex.config.ts +11 -5
  105. package/src/component/coverage.ts +25 -0
  106. package/src/component/diagnostics.ts +64 -0
  107. package/src/component/errors.ts +2 -1
  108. package/src/component/eventStore.ts +78 -280
  109. package/src/component/geo.ts +779 -0
  110. package/src/component/http.ts +259 -22
  111. package/src/component/ingest.ts +436 -27
  112. package/src/component/live.ts +8 -3
  113. package/src/component/reports.ts +895 -87
  114. package/src/component/retention.ts +624 -88
  115. package/src/component/sanitize.ts +15 -4
  116. package/src/component/schema.ts +125 -16
  117. package/src/component/sites.ts +5 -1
  118. package/src/component/validators.ts +12 -13
  119. package/src/test.ts +0 -2
  120. package/dist/component/migrations.d.ts +0 -17
  121. package/dist/component/migrations.d.ts.map +0 -1
  122. package/dist/component/migrations.js +0 -44
  123. package/dist/component/migrations.js.map +0 -1
  124. package/src/component/migrations.ts +0 -52
@@ -0,0 +1,183 @@
1
+ {
2
+ "$schema": "https://www.amagerastro.com/agent/manifest.schema.json",
3
+ "name": "amage-rastro",
4
+ "title": "Amage Rastro",
5
+ "description": "Privacy-first, real-time web analytics for Convex with a read-only federated dashboard.",
6
+ "manifestVersion": "1.0.0",
7
+ "language": "en",
8
+ "canonicalBaseUrl": "https://www.amagerastro.com",
9
+ "documentation": {
10
+ "human": "https://www.amagerastro.com/docs/",
11
+ "agent": "https://www.amagerastro.com/agent/integration.md",
12
+ "llms": "https://www.amagerastro.com/llms.txt",
13
+ "protocol": "https://www.amagerastro.com/docs/reference/federation.md",
14
+ "setup": "https://www.amagerastro.com/docs/reference/federation-setup.md",
15
+ "upgrading": "https://www.amagerastro.com/docs/reference/upgrading.md",
16
+ "integrity": {
17
+ "algorithm": "sha256",
18
+ "agent": "711faf2ca11ee22432cb8b51c7f64fb7e25045a6509391fc8532f08b2fdf3e11",
19
+ "llms": "8c1da1fea23f95a618c4d636840b793195fceedf05f81394df74e1ed5e3fc4da",
20
+ "protocol": "6d15aa19469d1e5e008949f1f42417875137ba040bb2bf4427841a5aa0caea77",
21
+ "setup": "04c61ecef029a99ba95e1002439dbd1e42ca1ce351e6deb0988fb556ffce649e",
22
+ "upgrading": "9ff81b8a5e4a615e284916aeae8c7602f3249093599f60b97066a614db406c5a"
23
+ }
24
+ },
25
+ "controlPlane": {
26
+ "dashboardUrl": "https://www.amagerastro.com",
27
+ "functionsUrl": "https://api.amagerastro.com",
28
+ "httpActionsUrl": "https://site.api.amagerastro.com",
29
+ "issuer": "https://site.api.amagerastro.com/federation",
30
+ "discoveryUrl": "https://site.api.amagerastro.com/federation/.well-known/openid-configuration",
31
+ "jwksUrl": "https://site.api.amagerastro.com/federation/jwks.json",
32
+ "tokenAlgorithm": "RS256",
33
+ "tokenLifetimeSeconds": 600
34
+ },
35
+ "package": {
36
+ "name": "@iann29/rastro",
37
+ "distTag": "alpha",
38
+ "availability": "verify-exact-registry-artifact",
39
+ "requiredRuntimeExports": [
40
+ "exposeFederatedAnalyticsApi",
41
+ "FEDERATED_ANALYTICS_CONNECTOR_MANIFEST",
42
+ "FEDERATED_ANALYTICS_ERROR_CODES"
43
+ ],
44
+ "requiredTypeExports": [
45
+ "FederatedAnalyticsConnection",
46
+ "FederatedAnalyticsAuthorizerOptions",
47
+ "FederatedSiteSummary"
48
+ ],
49
+ "versionDiscoveryCommand": "npm view @iann29/rastro@alpha version",
50
+ "inspectionPolicy": "static-tarball-inspection-no-lifecycle-scripts",
51
+ "agentActionWhenUnavailable": "stop-and-request-eligible-release"
52
+ },
53
+ "connector": {
54
+ "protocol": "amage-rastro-analytics",
55
+ "protocolVersion": 1,
56
+ "moduleName": "rastroFederation",
57
+ "functions": {
58
+ "manifest": "manifest",
59
+ "connectionStatus": "connectionStatus",
60
+ "listSites": "listSites",
61
+ "overview": "overview",
62
+ "liveVisitors": "liveVisitors",
63
+ "listSessions": "listSessions",
64
+ "sessionJourney": "sessionJourney",
65
+ "listConversions": "listConversions",
66
+ "visitorJourney": "visitorJourney",
67
+ "goalsReport": "goalsReport",
68
+ "funnelsReport": "funnelsReport",
69
+ "affiliatesReport": "affiliatesReport",
70
+ "dataCoverage": "dataCoverage"
71
+ },
72
+ "capabilities": [
73
+ "siteSummaries",
74
+ "overview",
75
+ "liveVisitors",
76
+ "sessions",
77
+ "sessionJourney",
78
+ "conversions",
79
+ "visitorJourney",
80
+ "goals",
81
+ "funnels",
82
+ "affiliates",
83
+ "dataCoverage"
84
+ ],
85
+ "limits": {
86
+ "maxSitesPerRequest": 10,
87
+ "maxSitesPerConnection": 10,
88
+ "maxReportRangeDays": 366,
89
+ "maxLiveVisitors": 500,
90
+ "maxJourneyEvents": 500
91
+ }
92
+ },
93
+ "authentication": {
94
+ "providerType": "customJwt",
95
+ "audience": "exact-normalized-customer-functions-url",
96
+ "permission": "analytics:read",
97
+ "claims": {
98
+ "connectionId": "rastro_connection_id",
99
+ "organizationId": "rastro_organization_id",
100
+ "permissions": "rastro_permissions"
101
+ },
102
+ "authoritativeScope": "customer-deployment-local-grant"
103
+ },
104
+ "querySemantics": {
105
+ "timeUnit": "unix-epoch-milliseconds",
106
+ "rangeBoundary": "inclusive",
107
+ "rangeTimezone": "UTC",
108
+ "overview": {
109
+ "hourlyMaxRangeHours": 24,
110
+ "dailyMaxRangeDays": 366,
111
+ "requiresCompleteUtcBuckets": true
112
+ },
113
+ "funnelsReport": {
114
+ "maxRangeDays": 90,
115
+ "requiresCompleteUtcDays": true
116
+ },
117
+ "affiliatesReport": {
118
+ "maxRangeDays": 366,
119
+ "requiresCompleteUtcDays": true
120
+ },
121
+ "journeysIncludeCustomProperties": true,
122
+ "featureReportsIncludeReadOnlyDefinitions": true
123
+ },
124
+ "integration": {
125
+ "mode": "customer-data-plane-central-control-plane",
126
+ "telemetryPath": "browser-tracker-to-customer-http-actions",
127
+ "dashboardReadPath": "browser-to-customer-functions",
128
+ "centralTelemetryStorage": false,
129
+ "requiresHumanPairing": true,
130
+ "requiresCustomerDeploymentAdmin": true,
131
+ "requiredHostFiles": [
132
+ "convex/schema.ts",
133
+ "convex/convex.config.ts",
134
+ "convex/auth.config.ts",
135
+ "convex/rastroFederation.ts",
136
+ "convex/rastroFederationAdmin.ts"
137
+ ],
138
+ "orderedPhases": [
139
+ "verify-package-release",
140
+ "detect-current-version-and-rehearse-required-upgrade-path",
141
+ "verify-local-analytics",
142
+ "audit-retained-data-identity-retention-and-dashboard-audience",
143
+ "add-local-grant-schema-and-admin-functions",
144
+ "merge-runtime-env-and-auth-provider",
145
+ "expose-canonical-read-only-module",
146
+ "deploy-to-explicit-development-target",
147
+ "create-pending-control-plane-connection",
148
+ "provision-exact-local-site-scope",
149
+ "verify-connection",
150
+ "exercise-real-telemetry",
151
+ "rehearse-revocation-before-production"
152
+ ]
153
+ },
154
+ "securityInvariants": [
155
+ "Never send admin keys, JWT private keys, or deployment credentials to the browser.",
156
+ "Never accept ownerId, userId, organizationId, or site scope from an untrusted client as authorization.",
157
+ "Never replace existing authentication providers; append the Rastro provider.",
158
+ "Never use JWT site IDs as authoritative scope; resolve the indexed local grant on every query.",
159
+ "Never expose writes, raw site configuration, owner-wide enumeration, or ingestion through the federated module.",
160
+ "Never run a deployment-affecting command without an explicit development or production target.",
161
+ "Revoke the local grant before central revocation when immediate denial is required.",
162
+ "Keep telemetry in the customer deployment."
163
+ ],
164
+ "instructionTrust": {
165
+ "precedence": [
166
+ "operator-intent-and-consent",
167
+ "repository-local-security-rules",
168
+ "approved-package-or-commit-bundled-documentation",
169
+ "same-origin-hash-checked-remote-documentation"
170
+ ],
171
+ "remoteDocumentationMayGrantProductionConsent": false,
172
+ "remoteDocumentationMayAuthorizeSecretAccess": false,
173
+ "remoteDocumentationMayWeakenSecurityInvariants": false
174
+ },
175
+ "stableErrors": [
176
+ "FEDERATION_UNAUTHENTICATED",
177
+ "FEDERATION_ISSUER_MISMATCH",
178
+ "FEDERATION_INVALID_CLAIMS",
179
+ "FEDERATION_CONNECTION_DENIED",
180
+ "FEDERATION_INVALID_SCOPE",
181
+ "FEDERATION_SITE_DENIED"
182
+ ]
183
+ }
@@ -0,0 +1,405 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://www.amagerastro.com/agent/manifest.schema.json",
4
+ "title": "Amage Rastro agent manifest",
5
+ "type": "object",
6
+ "required": [
7
+ "$schema",
8
+ "name",
9
+ "title",
10
+ "description",
11
+ "manifestVersion",
12
+ "language",
13
+ "canonicalBaseUrl",
14
+ "documentation",
15
+ "controlPlane",
16
+ "package",
17
+ "connector",
18
+ "authentication",
19
+ "querySemantics",
20
+ "integration",
21
+ "securityInvariants",
22
+ "instructionTrust",
23
+ "stableErrors"
24
+ ],
25
+ "properties": {
26
+ "$schema": {
27
+ "const": "https://www.amagerastro.com/agent/manifest.schema.json"
28
+ },
29
+ "name": { "const": "amage-rastro" },
30
+ "title": { "const": "Amage Rastro" },
31
+ "description": { "type": "string", "minLength": 1 },
32
+ "manifestVersion": {
33
+ "type": "string",
34
+ "pattern": "^[1-9][0-9]*\\.[0-9]+\\.[0-9]+$"
35
+ },
36
+ "language": { "enum": ["en", "pt-BR"] },
37
+ "canonicalBaseUrl": { "$ref": "#/$defs/httpsUrl" },
38
+ "documentation": {
39
+ "type": "object",
40
+ "required": [
41
+ "human",
42
+ "agent",
43
+ "llms",
44
+ "protocol",
45
+ "setup",
46
+ "upgrading",
47
+ "integrity"
48
+ ],
49
+ "properties": {
50
+ "human": { "$ref": "#/$defs/httpsUrl" },
51
+ "agent": { "$ref": "#/$defs/httpsUrl" },
52
+ "llms": { "$ref": "#/$defs/httpsUrl" },
53
+ "protocol": { "$ref": "#/$defs/httpsUrl" },
54
+ "setup": { "$ref": "#/$defs/httpsUrl" },
55
+ "upgrading": { "$ref": "#/$defs/httpsUrl" },
56
+ "integrity": {
57
+ "type": "object",
58
+ "required": [
59
+ "algorithm",
60
+ "agent",
61
+ "llms",
62
+ "protocol",
63
+ "setup",
64
+ "upgrading"
65
+ ],
66
+ "properties": {
67
+ "algorithm": { "const": "sha256" },
68
+ "agent": { "$ref": "#/$defs/sha256" },
69
+ "llms": { "$ref": "#/$defs/sha256" },
70
+ "protocol": { "$ref": "#/$defs/sha256" },
71
+ "setup": { "$ref": "#/$defs/sha256" },
72
+ "upgrading": { "$ref": "#/$defs/sha256" }
73
+ },
74
+ "additionalProperties": false
75
+ }
76
+ },
77
+ "additionalProperties": false
78
+ },
79
+ "controlPlane": {
80
+ "type": "object",
81
+ "required": [
82
+ "dashboardUrl",
83
+ "functionsUrl",
84
+ "httpActionsUrl",
85
+ "issuer",
86
+ "discoveryUrl",
87
+ "jwksUrl",
88
+ "tokenAlgorithm",
89
+ "tokenLifetimeSeconds"
90
+ ],
91
+ "properties": {
92
+ "dashboardUrl": { "$ref": "#/$defs/httpsUrl" },
93
+ "functionsUrl": { "$ref": "#/$defs/httpsUrl" },
94
+ "httpActionsUrl": { "$ref": "#/$defs/httpsUrl" },
95
+ "issuer": { "$ref": "#/$defs/httpsUrl" },
96
+ "discoveryUrl": { "$ref": "#/$defs/httpsUrl" },
97
+ "jwksUrl": { "$ref": "#/$defs/httpsUrl" },
98
+ "tokenAlgorithm": { "const": "RS256" },
99
+ "tokenLifetimeSeconds": { "const": 600 }
100
+ },
101
+ "additionalProperties": false
102
+ },
103
+ "package": {
104
+ "type": "object",
105
+ "required": [
106
+ "name",
107
+ "distTag",
108
+ "availability",
109
+ "requiredRuntimeExports",
110
+ "requiredTypeExports",
111
+ "versionDiscoveryCommand",
112
+ "inspectionPolicy",
113
+ "agentActionWhenUnavailable"
114
+ ],
115
+ "properties": {
116
+ "name": { "const": "@iann29/rastro" },
117
+ "distTag": { "const": "alpha" },
118
+ "availability": { "const": "verify-exact-registry-artifact" },
119
+ "requiredRuntimeExports": {
120
+ "type": "array",
121
+ "minItems": 3,
122
+ "uniqueItems": true,
123
+ "items": { "type": "string", "minLength": 1 }
124
+ },
125
+ "requiredTypeExports": {
126
+ "type": "array",
127
+ "minItems": 3,
128
+ "uniqueItems": true,
129
+ "items": { "type": "string", "minLength": 1 }
130
+ },
131
+ "versionDiscoveryCommand": { "type": "string", "minLength": 1 },
132
+ "inspectionPolicy": {
133
+ "const": "static-tarball-inspection-no-lifecycle-scripts"
134
+ },
135
+ "agentActionWhenUnavailable": {
136
+ "const": "stop-and-request-eligible-release"
137
+ }
138
+ },
139
+ "additionalProperties": false
140
+ },
141
+ "connector": {
142
+ "type": "object",
143
+ "required": [
144
+ "protocol",
145
+ "protocolVersion",
146
+ "moduleName",
147
+ "functions",
148
+ "capabilities",
149
+ "limits"
150
+ ],
151
+ "properties": {
152
+ "protocol": { "const": "amage-rastro-analytics" },
153
+ "protocolVersion": { "const": 1 },
154
+ "moduleName": { "const": "rastroFederation" },
155
+ "functions": {
156
+ "type": "object",
157
+ "required": [
158
+ "manifest",
159
+ "connectionStatus",
160
+ "listSites",
161
+ "overview",
162
+ "liveVisitors",
163
+ "listSessions",
164
+ "sessionJourney",
165
+ "listConversions",
166
+ "visitorJourney",
167
+ "goalsReport",
168
+ "funnelsReport",
169
+ "affiliatesReport",
170
+ "dataCoverage"
171
+ ],
172
+ "properties": {
173
+ "manifest": { "const": "manifest" },
174
+ "connectionStatus": { "const": "connectionStatus" },
175
+ "listSites": { "const": "listSites" },
176
+ "overview": { "const": "overview" },
177
+ "liveVisitors": { "const": "liveVisitors" },
178
+ "listSessions": { "const": "listSessions" },
179
+ "sessionJourney": { "const": "sessionJourney" },
180
+ "listConversions": { "const": "listConversions" },
181
+ "visitorJourney": { "const": "visitorJourney" },
182
+ "goalsReport": { "const": "goalsReport" },
183
+ "funnelsReport": { "const": "funnelsReport" },
184
+ "affiliatesReport": { "const": "affiliatesReport" },
185
+ "dataCoverage": { "const": "dataCoverage" }
186
+ },
187
+ "additionalProperties": false
188
+ },
189
+ "capabilities": {
190
+ "type": "array",
191
+ "minItems": 11,
192
+ "maxItems": 11,
193
+ "uniqueItems": true,
194
+ "items": {
195
+ "enum": [
196
+ "siteSummaries",
197
+ "overview",
198
+ "liveVisitors",
199
+ "sessions",
200
+ "sessionJourney",
201
+ "conversions",
202
+ "visitorJourney",
203
+ "goals",
204
+ "funnels",
205
+ "affiliates",
206
+ "dataCoverage"
207
+ ]
208
+ }
209
+ },
210
+ "limits": {
211
+ "type": "object",
212
+ "required": [
213
+ "maxSitesPerRequest",
214
+ "maxSitesPerConnection",
215
+ "maxReportRangeDays",
216
+ "maxLiveVisitors",
217
+ "maxJourneyEvents"
218
+ ],
219
+ "properties": {
220
+ "maxSitesPerRequest": { "const": 10 },
221
+ "maxSitesPerConnection": { "const": 10 },
222
+ "maxReportRangeDays": { "const": 366 },
223
+ "maxLiveVisitors": { "const": 500 },
224
+ "maxJourneyEvents": { "const": 500 }
225
+ },
226
+ "additionalProperties": false
227
+ }
228
+ },
229
+ "additionalProperties": false
230
+ },
231
+ "authentication": {
232
+ "type": "object",
233
+ "required": [
234
+ "providerType",
235
+ "audience",
236
+ "permission",
237
+ "claims",
238
+ "authoritativeScope"
239
+ ],
240
+ "properties": {
241
+ "providerType": { "const": "customJwt" },
242
+ "audience": { "const": "exact-normalized-customer-functions-url" },
243
+ "permission": { "const": "analytics:read" },
244
+ "claims": {
245
+ "type": "object",
246
+ "required": ["connectionId", "organizationId", "permissions"],
247
+ "properties": {
248
+ "connectionId": { "const": "rastro_connection_id" },
249
+ "organizationId": { "const": "rastro_organization_id" },
250
+ "permissions": { "const": "rastro_permissions" }
251
+ },
252
+ "additionalProperties": false
253
+ },
254
+ "authoritativeScope": { "const": "customer-deployment-local-grant" }
255
+ },
256
+ "additionalProperties": false
257
+ },
258
+ "querySemantics": {
259
+ "type": "object",
260
+ "required": [
261
+ "timeUnit",
262
+ "rangeBoundary",
263
+ "rangeTimezone",
264
+ "overview",
265
+ "funnelsReport",
266
+ "affiliatesReport",
267
+ "journeysIncludeCustomProperties",
268
+ "featureReportsIncludeReadOnlyDefinitions"
269
+ ],
270
+ "properties": {
271
+ "timeUnit": { "const": "unix-epoch-milliseconds" },
272
+ "rangeBoundary": { "const": "inclusive" },
273
+ "rangeTimezone": { "const": "UTC" },
274
+ "overview": {
275
+ "type": "object",
276
+ "required": [
277
+ "hourlyMaxRangeHours",
278
+ "dailyMaxRangeDays",
279
+ "requiresCompleteUtcBuckets"
280
+ ],
281
+ "properties": {
282
+ "hourlyMaxRangeHours": { "const": 24 },
283
+ "dailyMaxRangeDays": { "const": 366 },
284
+ "requiresCompleteUtcBuckets": { "const": true }
285
+ },
286
+ "additionalProperties": false
287
+ },
288
+ "funnelsReport": {
289
+ "allOf": [
290
+ { "$ref": "#/$defs/completeDayRange" },
291
+ {
292
+ "type": "object",
293
+ "properties": { "maxRangeDays": { "const": 90 } }
294
+ }
295
+ ]
296
+ },
297
+ "affiliatesReport": {
298
+ "allOf": [
299
+ { "$ref": "#/$defs/completeDayRange" },
300
+ {
301
+ "type": "object",
302
+ "properties": { "maxRangeDays": { "const": 366 } }
303
+ }
304
+ ]
305
+ },
306
+ "journeysIncludeCustomProperties": { "const": true },
307
+ "featureReportsIncludeReadOnlyDefinitions": { "const": true }
308
+ },
309
+ "additionalProperties": false
310
+ },
311
+ "integration": {
312
+ "type": "object",
313
+ "required": [
314
+ "mode",
315
+ "telemetryPath",
316
+ "dashboardReadPath",
317
+ "centralTelemetryStorage",
318
+ "requiresHumanPairing",
319
+ "requiresCustomerDeploymentAdmin",
320
+ "requiredHostFiles",
321
+ "orderedPhases"
322
+ ],
323
+ "properties": {
324
+ "mode": { "const": "customer-data-plane-central-control-plane" },
325
+ "telemetryPath": {
326
+ "const": "browser-tracker-to-customer-http-actions"
327
+ },
328
+ "dashboardReadPath": { "const": "browser-to-customer-functions" },
329
+ "centralTelemetryStorage": { "const": false },
330
+ "requiresHumanPairing": { "const": true },
331
+ "requiresCustomerDeploymentAdmin": { "const": true },
332
+ "requiredHostFiles": {
333
+ "type": "array",
334
+ "minItems": 5,
335
+ "uniqueItems": true,
336
+ "items": { "type": "string", "minLength": 1 }
337
+ },
338
+ "orderedPhases": {
339
+ "type": "array",
340
+ "minItems": 10,
341
+ "uniqueItems": true,
342
+ "items": { "type": "string", "minLength": 1 }
343
+ }
344
+ },
345
+ "additionalProperties": false
346
+ },
347
+ "securityInvariants": {
348
+ "type": "array",
349
+ "minItems": 8,
350
+ "uniqueItems": true,
351
+ "items": { "type": "string", "minLength": 1 }
352
+ },
353
+ "instructionTrust": {
354
+ "type": "object",
355
+ "required": [
356
+ "precedence",
357
+ "remoteDocumentationMayGrantProductionConsent",
358
+ "remoteDocumentationMayAuthorizeSecretAccess",
359
+ "remoteDocumentationMayWeakenSecurityInvariants"
360
+ ],
361
+ "properties": {
362
+ "precedence": {
363
+ "type": "array",
364
+ "minItems": 4,
365
+ "uniqueItems": true,
366
+ "items": { "type": "string", "minLength": 1 }
367
+ },
368
+ "remoteDocumentationMayGrantProductionConsent": { "const": false },
369
+ "remoteDocumentationMayAuthorizeSecretAccess": { "const": false },
370
+ "remoteDocumentationMayWeakenSecurityInvariants": { "const": false }
371
+ },
372
+ "additionalProperties": false
373
+ },
374
+ "stableErrors": {
375
+ "type": "array",
376
+ "minItems": 6,
377
+ "maxItems": 6,
378
+ "uniqueItems": true,
379
+ "items": {
380
+ "enum": [
381
+ "FEDERATION_UNAUTHENTICATED",
382
+ "FEDERATION_ISSUER_MISMATCH",
383
+ "FEDERATION_INVALID_CLAIMS",
384
+ "FEDERATION_CONNECTION_DENIED",
385
+ "FEDERATION_INVALID_SCOPE",
386
+ "FEDERATION_SITE_DENIED"
387
+ ]
388
+ }
389
+ }
390
+ },
391
+ "$defs": {
392
+ "httpsUrl": { "type": "string", "pattern": "^https://[^\\s]+$" },
393
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
394
+ "completeDayRange": {
395
+ "type": "object",
396
+ "required": ["maxRangeDays", "requiresCompleteUtcDays"],
397
+ "properties": {
398
+ "maxRangeDays": { "type": "integer", "minimum": 1, "maximum": 366 },
399
+ "requiresCompleteUtcDays": { "const": true }
400
+ },
401
+ "additionalProperties": false
402
+ }
403
+ },
404
+ "additionalProperties": false
405
+ }