@fjall/deploy-core 2.25.0 → 2.29.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.
- package/dist/.minified +1 -1
- package/dist/src/aws/index.d.ts +1 -1
- package/dist/src/aws/index.js +1 -1
- package/dist/src/aws/organisations/backup.d.ts +7 -2
- package/dist/src/aws/organisations/backup.js +2 -2
- package/dist/src/aws/organisations/index.d.ts +2 -2
- package/dist/src/aws/organisations/index.js +1 -1
- package/dist/src/aws/organisations/oidcProvider.d.ts +37 -0
- package/dist/src/aws/organisations/oidcProvider.js +1 -1
- package/dist/src/aws/organisations/organisation.d.ts +21 -0
- package/dist/src/aws/organisations/organisation.js +1 -1
- package/dist/src/aws/organisations/organisationalUnits.d.ts +15 -0
- package/dist/src/aws/organisations/organisationalUnits.js +1 -1
- package/dist/src/aws/utils/cloudformationEventHelpers.d.ts +45 -0
- package/dist/src/aws/utils/cloudformationEventHelpers.js +1 -1
- package/dist/src/aws/utils/cloudformationEventTypes.d.ts +1 -1
- package/dist/src/aws/utils/cloudformationEvents.d.ts +2 -1
- package/dist/src/aws/utils/cloudformationEvents.js +1 -1
- package/dist/src/aws/utils/stackStatus.js +1 -1
- package/dist/src/index.d.ts +13 -2
- package/dist/src/index.js +1 -1
- package/dist/src/orchestration/activeDeploymentGuard.d.ts +41 -0
- package/dist/src/orchestration/activeDeploymentGuard.js +8 -4
- package/dist/src/orchestration/application/applicationDeploy.d.ts +9 -0
- package/dist/src/orchestration/application/applicationDeploy.js +1 -1
- package/dist/src/orchestration/application/applicationDeployHelpers.d.ts +20 -3
- package/dist/src/orchestration/application/applicationDeployHelpers.js +3 -3
- package/dist/src/orchestration/application/applicationDestroy.js +1 -1
- package/dist/src/orchestration/application/approvalGate.d.ts +15 -1
- package/dist/src/orchestration/application/approvalGate.js +1 -1
- package/dist/src/orchestration/application/databaseEndpointReconcile.d.ts +77 -0
- package/dist/src/orchestration/application/databaseEndpointReconcile.js +1 -0
- package/dist/src/orchestration/application/deploySessionPolicy.d.ts +9 -1
- package/dist/src/orchestration/application/deploySessionPolicy.js +1 -1
- package/dist/src/orchestration/application/destructionGate.d.ts +164 -0
- package/dist/src/orchestration/application/destructionGate.js +5 -0
- package/dist/src/orchestration/application/dockerBuildHelper.js +1 -1
- package/dist/src/orchestration/application/ecrCacheRepository.d.ts +14 -0
- package/dist/src/orchestration/application/ecrCacheRepository.js +1 -0
- package/dist/src/orchestration/application/leaseGate.d.ts +30 -0
- package/dist/src/orchestration/application/leaseGate.js +1 -0
- package/dist/src/orchestration/application/plan/approvalToken.d.ts +15 -0
- package/dist/src/orchestration/application/plan/approvalToken.js +1 -1
- package/dist/src/orchestration/application/plan/changeSetEscalation.d.ts +46 -0
- package/dist/src/orchestration/application/plan/changeSetEscalation.js +1 -0
- package/dist/src/orchestration/application/plan/computeDeployPlan.d.ts +13 -0
- package/dist/src/orchestration/application/plan/computeDeployPlan.js +1 -1
- package/dist/src/orchestration/application/plan/index.d.ts +4 -1
- package/dist/src/orchestration/application/plan/index.js +1 -1
- package/dist/src/orchestration/application/plan/loadDeployPlan.d.ts +32 -0
- package/dist/src/orchestration/application/plan/loadDeployPlan.js +1 -0
- package/dist/src/orchestration/application/plan/pinnedNames.d.ts +31 -0
- package/dist/src/orchestration/application/plan/pinnedNames.js +1 -0
- package/dist/src/orchestration/application/plan/registryOverlay.d.ts +83 -0
- package/dist/src/orchestration/application/plan/registryOverlay.js +1 -0
- package/dist/src/orchestration/application/plan/renderDeployPlan.d.ts +4 -1
- package/dist/src/orchestration/application/plan/renderDeployPlan.js +1 -1
- package/dist/src/orchestration/application/plan/types.d.ts +31 -0
- package/dist/src/orchestration/application/plan/types.js +1 -0
- package/dist/src/orchestration/contextHelpers.d.ts +37 -1
- package/dist/src/orchestration/contextHelpers.js +1 -1
- package/dist/src/orchestration/drift/classifyDriftFailure.d.ts +31 -0
- package/dist/src/orchestration/drift/classifyDriftFailure.js +1 -0
- package/dist/src/orchestration/drift/detectStackDrift.d.ts +37 -0
- package/dist/src/orchestration/drift/detectStackDrift.js +1 -0
- package/dist/src/orchestration/drift/driftPreFlight.d.ts +73 -0
- package/dist/src/orchestration/drift/driftPreFlight.js +7 -0
- package/dist/src/orchestration/drift/driftProbe.d.ts +113 -0
- package/dist/src/orchestration/drift/driftProbe.js +1 -0
- package/dist/src/orchestration/drift/driftSuspectJournal.d.ts +40 -0
- package/dist/src/orchestration/drift/driftSuspectJournal.js +1 -0
- package/dist/src/orchestration/drift/preFlightGate.d.ts +44 -0
- package/dist/src/orchestration/drift/preFlightGate.js +2 -0
- package/dist/src/orchestration/index.d.ts +19 -0
- package/dist/src/orchestration/index.js +1 -1
- package/dist/src/orchestration/organisation/cascadeDestroyHelpers.d.ts +7 -0
- package/dist/src/orchestration/organisation/cascadeDestroyHelpers.js +1 -1
- package/dist/src/orchestration/organisation/cascadeHelpers.js +1 -1
- package/dist/src/orchestration/organisation/organisationDestroy.js +3 -3
- package/dist/src/orchestration/organisationDeploy/infraSteps.d.ts +8 -1
- package/dist/src/orchestration/organisationDeploy/infraSteps.js +1 -1
- package/dist/src/orchestration/organisationDeploy/orgCascadeDeploy.js +5 -5
- package/dist/src/orchestration/organisationDeploy/orgContext.d.ts +28 -2
- package/dist/src/orchestration/organisationDeploy/orgContext.js +1 -1
- package/dist/src/orchestration/organisationDeploy/singleComponentDeploy.js +1 -1
- package/dist/src/orchestration/remediation/driftRepairGate.d.ts +66 -0
- package/dist/src/orchestration/remediation/driftRepairGate.js +1 -0
- package/dist/src/orchestration/remediation/forensicsCapture.d.ts +49 -0
- package/dist/src/orchestration/remediation/forensicsCapture.js +1 -0
- package/dist/src/orchestration/remediation/forgetResource.d.ts +423 -0
- package/dist/src/orchestration/remediation/forgetResource.js +1 -0
- package/dist/src/orchestration/remediation/pinRemediation.d.ts +121 -0
- package/dist/src/orchestration/remediation/pinRemediation.js +1 -0
- package/dist/src/orchestration/remediation/postFailureRepairOffer.d.ts +77 -0
- package/dist/src/orchestration/remediation/postFailureRepairOffer.js +14 -0
- package/dist/src/orchestration/remediation/recreatePreFlight.d.ts +47 -0
- package/dist/src/orchestration/remediation/recreatePreFlight.js +1 -0
- package/dist/src/orchestration/remediation/recreateResource.d.ts +110 -0
- package/dist/src/orchestration/remediation/recreateResource.js +1 -0
- package/dist/src/orchestration/remediation/remediationJournal.d.ts +88 -0
- package/dist/src/orchestration/remediation/remediationJournal.js +2 -0
- package/dist/src/orchestration/remediation/removalUpdate.d.ts +135 -0
- package/dist/src/orchestration/remediation/removalUpdate.js +1 -0
- package/dist/src/orchestration/remediation/retainFlip.d.ts +294 -0
- package/dist/src/orchestration/remediation/retainFlip.js +1 -0
- package/dist/src/services/application/ApplicationStackService.d.ts +5 -3
- package/dist/src/services/application/ApplicationStackService.js +1 -1
- package/dist/src/services/application/applicationStackHelpers.d.ts +8 -6
- package/dist/src/services/application/applicationStackHelpers.js +3 -3
- package/dist/src/services/index.d.ts +2 -2
- package/dist/src/services/index.js +1 -1
- package/dist/src/services/infrastructure/CdkArgumentBuilder.js +1 -1
- package/dist/src/services/infrastructure/CdkEventMonitoring.d.ts +15 -0
- package/dist/src/services/infrastructure/CdkEventMonitoring.js +1 -1
- package/dist/src/services/infrastructure/CdkOutputAnalyser.d.ts +8 -0
- package/dist/src/services/infrastructure/CdkOutputAnalyser.js +2 -1
- package/dist/src/services/infrastructure/CdkService.js +3 -3
- package/dist/src/services/infrastructure/CdkServiceTypes.d.ts +7 -0
- package/dist/src/services/infrastructure/CfnRegistryService.d.ts +68 -0
- package/dist/src/services/infrastructure/CfnRegistryService.js +1 -0
- package/dist/src/services/infrastructure/CloudFormationService.d.ts +5 -2
- package/dist/src/services/infrastructure/CloudFormationService.js +1 -1
- package/dist/src/services/infrastructure/EcsServiceResolver.d.ts +23 -3
- package/dist/src/services/infrastructure/EcsServiceResolver.js +1 -1
- package/dist/src/services/infrastructure/cdkServiceHelpers.js +1 -1
- package/dist/src/services/infrastructure/cfnRegistrySeed.d.ts +10 -0
- package/dist/src/services/infrastructure/cfnRegistrySeed.js +1 -0
- package/dist/src/services/infrastructure/changeSetProbe.d.ts +88 -0
- package/dist/src/services/infrastructure/changeSetProbe.js +1 -0
- package/dist/src/services/infrastructure/index.d.ts +2 -0
- package/dist/src/services/infrastructure/index.js +1 -1
- package/dist/src/services/supporting/CdkContextBuilder.d.ts +1 -0
- package/dist/src/services/supporting/CdkContextBuilder.js +1 -1
- package/dist/src/types/callbackKeys.d.ts +1 -1
- package/dist/src/types/callbackKeys.js +1 -1
- package/dist/src/types/callbacks.d.ts +22 -0
- package/dist/src/types/config/entitlements.d.ts +9 -0
- package/dist/src/types/config/orgConfig.d.ts +6 -0
- package/dist/src/types/deployment/DeploymentTypes.d.ts +1 -0
- package/dist/src/types/deploymentEventSchema.d.ts +1 -0
- package/dist/src/types/deploymentEventSchema.js +1 -1
- package/dist/src/types/destruction.d.ts +212 -0
- package/dist/src/types/destruction.js +1 -0
- package/dist/src/types/drift.d.ts +72 -0
- package/dist/src/types/drift.js +1 -0
- package/dist/src/types/index.d.ts +8 -2
- package/dist/src/types/index.js +1 -1
- package/dist/src/types/params.d.ts +161 -0
- package/dist/src/types/remediation.d.ts +126 -0
- package/dist/src/types/remediation.js +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The remediation-journal contract for the two-deploy `forget` orchestration
|
|
3
|
+
* and its snapshot-flip `recreate` variant (drift-remediation plan § 3.2 /
|
|
4
|
+
* Phase 7). Declared ONCE here; the CLI re-exports, never redeclares (coupled
|
|
5
|
+
* discriminated unions share a source at 2 occurrences).
|
|
6
|
+
*
|
|
7
|
+
* Phases are strictly ordered: `captured → flip-verified → flip-applied →
|
|
8
|
+
* removal-applied → done`. Every phase re-derives its precondition from live
|
|
9
|
+
* state before acting, so a lost journal degrades to correct re-detection via
|
|
10
|
+
* the in-template `fjall:forget` / `fjall:recreate` marker [G3] — the journal
|
|
11
|
+
* is the local resume record and audit trail, not the sole authority.
|
|
12
|
+
* Exception: targets advanced via the FLIPLESS fast-path (`fliplessTargets` —
|
|
13
|
+
* live policies already satisfied the flip spec, so no UpdateStack ran and no
|
|
14
|
+
* marker was stamped; 2026-07-12 live defect #5) and via the
|
|
15
|
+
* FLIPLESS-BY-NECESSITY path (`fliplessByNecessity` — the flip was
|
|
16
|
+
* structurally impossible and the target verified physically deleted; same
|
|
17
|
+
* incident, second direction) carry no AWS-side resume state — their
|
|
18
|
+
* lost-journal degradation is re-consent at the ceremony, never a silent
|
|
19
|
+
* skip.
|
|
20
|
+
*/
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
export declare const REMEDIATION_PHASES: readonly ["captured", "flip-verified", "flip-applied", "removal-applied", "done"];
|
|
23
|
+
export declare const RemediationPhaseSchema: z.ZodEnum<{
|
|
24
|
+
captured: "captured";
|
|
25
|
+
"flip-verified": "flip-verified";
|
|
26
|
+
"flip-applied": "flip-applied";
|
|
27
|
+
"removal-applied": "removal-applied";
|
|
28
|
+
done: "done";
|
|
29
|
+
}>;
|
|
30
|
+
export type RemediationPhase = z.infer<typeof RemediationPhaseSchema>;
|
|
31
|
+
/** Ordinal comparison for phase progression checks. */
|
|
32
|
+
export declare function remediationPhaseRank(phase: RemediationPhase): number;
|
|
33
|
+
export declare const RemediationTargetSchema: z.ZodObject<{
|
|
34
|
+
logicalId: z.ZodString;
|
|
35
|
+
resourceType: z.ZodString;
|
|
36
|
+
physicalId: z.ZodString;
|
|
37
|
+
}, z.core.$strict>;
|
|
38
|
+
export type RemediationTarget = z.infer<typeof RemediationTargetSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Placeholder physicalId for a target whose live physical id is unknown —
|
|
41
|
+
* an adopted foreign-op target recovered from the `fjall:forget` marker, or
|
|
42
|
+
* a confirmed finding whose membership listing could not resolve an id. The
|
|
43
|
+
* shape is structurally recognisable so probe paths can refuse to treat it
|
|
44
|
+
* as an owning-service address: probing `MyStack/MyKey` against
|
|
45
|
+
* kms:DescribeKey returns an authoritative NotFound for a resource that may
|
|
46
|
+
* be live. Coupled values, one home — every minting site routes through this
|
|
47
|
+
* builder: the CLI's journal targets, the drift-repair ticket's [G6]
|
|
48
|
+
* `physicalName` fallback (which must byte-agree with those targets so the
|
|
49
|
+
* consent covers what is operated on), and the deploy destruction ticket's
|
|
50
|
+
* unpinned-name fallback (the same resource renders on both tickets in the
|
|
51
|
+
* blocked-deploy → repair flow); deploy-core's closure probe recognises the
|
|
52
|
+
* shape via the predicate below.
|
|
53
|
+
*/
|
|
54
|
+
export declare function remediationPlaceholderPhysicalId(stackName: string, logicalId: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* True when the target's physicalId is the placeholder minted by
|
|
57
|
+
* `remediationPlaceholderPhysicalId` — never a probeable address.
|
|
58
|
+
*/
|
|
59
|
+
export declare function isRemediationPlaceholderPhysicalId(target: RemediationTarget, stackName: string): boolean;
|
|
60
|
+
/** Proof record that the retain flip was verified metadata-only (§3.2 ph 2). */
|
|
61
|
+
export declare const RemediationFlipProofSchema: z.ZodObject<{
|
|
62
|
+
diffGuardPassed: z.ZodBoolean;
|
|
63
|
+
changeSetMetadataOnly: z.ZodBoolean;
|
|
64
|
+
noChanges: z.ZodBoolean;
|
|
65
|
+
provenAt: z.ZodString;
|
|
66
|
+
}, z.core.$strict>;
|
|
67
|
+
export type RemediationFlipProof = z.infer<typeof RemediationFlipProofSchema>;
|
|
68
|
+
/**
|
|
69
|
+
* The verbs with an orchestrated surgery arm. `forget` retains-and-abandons
|
|
70
|
+
* (converge removes the declaration); `recreate` snapshot-flips and surgically
|
|
71
|
+
* removes so the converge re-CREATEs under the same pinned name. The opId
|
|
72
|
+
* derivation deliberately excludes the verb — both orchestrators verb-guard
|
|
73
|
+
* the journal they read, failing closed on a cross-verb collision.
|
|
74
|
+
*/
|
|
75
|
+
export declare const RemediationVerbWithSurgerySchema: z.ZodEnum<{
|
|
76
|
+
forget: "forget";
|
|
77
|
+
recreate: "recreate";
|
|
78
|
+
}>;
|
|
79
|
+
export type RemediationVerbWithSurgery = z.infer<typeof RemediationVerbWithSurgerySchema>;
|
|
80
|
+
export declare const RemediationJournalRecordSchema: z.ZodObject<{
|
|
81
|
+
version: z.ZodLiteral<1>;
|
|
82
|
+
opId: z.ZodString;
|
|
83
|
+
verb: z.ZodEnum<{
|
|
84
|
+
forget: "forget";
|
|
85
|
+
recreate: "recreate";
|
|
86
|
+
}>;
|
|
87
|
+
accountId: z.ZodString;
|
|
88
|
+
region: z.ZodString;
|
|
89
|
+
stackName: z.ZodString;
|
|
90
|
+
appName: z.ZodOptional<z.ZodString>;
|
|
91
|
+
targets: z.ZodArray<z.ZodObject<{
|
|
92
|
+
logicalId: z.ZodString;
|
|
93
|
+
resourceType: z.ZodString;
|
|
94
|
+
physicalId: z.ZodString;
|
|
95
|
+
}, z.core.$strict>>;
|
|
96
|
+
phase: z.ZodEnum<{
|
|
97
|
+
captured: "captured";
|
|
98
|
+
"flip-verified": "flip-verified";
|
|
99
|
+
"flip-applied": "flip-applied";
|
|
100
|
+
"removal-applied": "removal-applied";
|
|
101
|
+
done: "done";
|
|
102
|
+
}>;
|
|
103
|
+
createdAt: z.ZodString;
|
|
104
|
+
updatedAt: z.ZodString;
|
|
105
|
+
liveTemplateDigest: z.ZodOptional<z.ZodString>;
|
|
106
|
+
forensicsPath: z.ZodOptional<z.ZodString>;
|
|
107
|
+
proof: z.ZodOptional<z.ZodObject<{
|
|
108
|
+
diffGuardPassed: z.ZodBoolean;
|
|
109
|
+
changeSetMetadataOnly: z.ZodBoolean;
|
|
110
|
+
noChanges: z.ZodBoolean;
|
|
111
|
+
provenAt: z.ZodString;
|
|
112
|
+
}, z.core.$strict>>;
|
|
113
|
+
consentedPhysicalNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
114
|
+
retainedByRedeclaration: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
115
|
+
fliplessTargets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
116
|
+
fliplessByNecessity: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
117
|
+
recreatedResources: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
118
|
+
snapshotPolicies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
119
|
+
Snapshot: "Snapshot";
|
|
120
|
+
Delete: "Delete";
|
|
121
|
+
}>>>;
|
|
122
|
+
orphanedResources: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
123
|
+
unverifiedRemovals: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
124
|
+
completedAt: z.ZodOptional<z.ZodString>;
|
|
125
|
+
}, z.core.$strict>;
|
|
126
|
+
export type RemediationJournalRecord = z.infer<typeof RemediationJournalRecordSchema>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";const t=["captured","flip-verified","flip-applied","removal-applied","done"],r=e.enum(t);function p(i){return t.indexOf(i)}const o=e.object({logicalId:e.string().min(1),resourceType:e.string().min(1),physicalId:e.string().min(1)}).strict();function a(i,n){return`${i}/${n}`}function m(i,n){return i.physicalId===a(n,i.logicalId)}const s=e.object({diffGuardPassed:e.boolean(),changeSetMetadataOnly:e.boolean(),noChanges:e.boolean(),provenAt:e.string().min(1)}).strict(),l=e.enum(["forget","recreate"]),d=e.object({version:e.literal(1),opId:e.string().min(1),verb:l,accountId:e.string().min(1),region:e.string().min(1),stackName:e.string().min(1),appName:e.string().min(1).optional(),targets:e.array(o).min(1),phase:r,createdAt:e.string().min(1),updatedAt:e.string().min(1),liveTemplateDigest:e.string().min(1).optional(),forensicsPath:e.string().min(1).optional(),proof:s.optional(),consentedPhysicalNames:e.array(e.string()).optional(),retainedByRedeclaration:e.array(e.string().min(1)).optional(),fliplessTargets:e.array(e.string().min(1)).optional(),fliplessByNecessity:e.array(e.string().min(1)).optional(),recreatedResources:e.array(e.string().min(1)).optional(),snapshotPolicies:e.record(e.string().min(1),e.enum(["Snapshot","Delete"])).optional(),orphanedResources:e.array(e.string().min(1)).optional(),unverifiedRemovals:e.array(e.string().min(1)).optional(),completedAt:e.string().min(1).optional()}).strict();export{t as REMEDIATION_PHASES,s as RemediationFlipProofSchema,d as RemediationJournalRecordSchema,r as RemediationPhaseSchema,o as RemediationTargetSchema,l as RemediationVerbWithSurgerySchema,m as isRemediationPlaceholderPhysicalId,p as remediationPhaseRank,a as remediationPlaceholderPhysicalId};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/deploy-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.29.0",
|
|
4
4
|
"description": "Shared deployment engine for Fjall — used by CLI and webapp worker",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -76,14 +76,15 @@
|
|
|
76
76
|
"@aws-sdk/client-kms": "^3.1065.0",
|
|
77
77
|
"@aws-sdk/client-organizations": "^3.1038.0",
|
|
78
78
|
"@aws-sdk/client-ram": "^3.1038.0",
|
|
79
|
+
"@aws-sdk/client-rds": "^3.1038.0",
|
|
79
80
|
"@aws-sdk/client-s3": "^3.1038.0",
|
|
80
81
|
"@aws-sdk/client-secrets-manager": "^3.1038.0",
|
|
81
82
|
"@aws-sdk/client-sqs": "^3.1067.0",
|
|
82
83
|
"@aws-sdk/client-ssm": "^3.1038.0",
|
|
83
84
|
"@aws-sdk/client-sso-admin": "^3.1038.0",
|
|
84
85
|
"@aws-sdk/client-sts": "^3.1038.0",
|
|
85
|
-
"@fjall/generator": "^2.
|
|
86
|
-
"@fjall/util": "^2.
|
|
86
|
+
"@fjall/generator": "^2.29.0",
|
|
87
|
+
"@fjall/util": "^2.29.0",
|
|
87
88
|
"@smithy/node-http-handler": "^4.6.1",
|
|
88
89
|
"aws-cdk": "^2.1128.1",
|
|
89
90
|
"tsx": "^4.21.0",
|
|
@@ -94,5 +95,5 @@
|
|
|
94
95
|
"typescript": "^6.0.3",
|
|
95
96
|
"vitest": "^4.1.5"
|
|
96
97
|
},
|
|
97
|
-
"gitHead": "
|
|
98
|
+
"gitHead": "c40ea0e1435400f3f42faaad5bcbf50e4400c1d4"
|
|
98
99
|
}
|